cifs: find mid earlier in receive codepath
[deliverable/linux.git] / fs / cifs / connect.c
CommitLineData
1da177e4
LT
1/*
2 * fs/cifs/connect.c
3 *
d185cda7 4 * Copyright (C) International Business Machines Corp., 2002,2009
1da177e4
LT
5 * Author(s): Steve French (sfrench@us.ibm.com)
6 *
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.
11 *
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.
16 *
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
fb8c4b14 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1da177e4
LT
20 */
21#include <linux/fs.h>
22#include <linux/net.h>
23#include <linux/string.h>
24#include <linux/list.h>
25#include <linux/wait.h>
5a0e3ad6 26#include <linux/slab.h>
1da177e4
LT
27#include <linux/pagemap.h>
28#include <linux/ctype.h>
29#include <linux/utsname.h>
30#include <linux/mempool.h>
b8643e1b 31#include <linux/delay.h>
f191401f 32#include <linux/completion.h>
aaf737ad 33#include <linux/kthread.h>
0ae0efad 34#include <linux/pagevec.h>
7dfb7103 35#include <linux/freezer.h>
5c2503a8 36#include <linux/namei.h>
1da177e4
LT
37#include <asm/uaccess.h>
38#include <asm/processor.h>
50b64e3b 39#include <linux/inet.h>
0e2bedaa 40#include <net/ipv6.h>
1da177e4
LT
41#include "cifspdu.h"
42#include "cifsglob.h"
43#include "cifsproto.h"
44#include "cifs_unicode.h"
45#include "cifs_debug.h"
46#include "cifs_fs_sb.h"
47#include "ntlmssp.h"
48#include "nterr.h"
49#include "rfc1002pdu.h"
488f1d2d 50#include "fscache.h"
1da177e4
LT
51
52#define CIFS_PORT 445
53#define RFC1001_PORT 139
54
c74093b6
JL
55/* SMB echo "timeout" -- FIXME: tunable? */
56#define SMB_ECHO_INTERVAL (60 * HZ)
57
1da177e4
LT
58extern mempool_t *cifs_req_poolp;
59
2de970ff 60/* FIXME: should these be tunable? */
9d002df4 61#define TLINK_ERROR_EXPIRE (1 * HZ)
2de970ff 62#define TLINK_IDLE_EXPIRE (600 * HZ)
9d002df4 63
a9f1b85e
PS
64static int ip_connect(struct TCP_Server_Info *server);
65static int generic_ip_connect(struct TCP_Server_Info *server);
b647c35f 66static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
2de970ff 67static void cifs_prune_tlinks(struct work_struct *work);
b9bce2e9
JL
68static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
69 const char *devname);
1da177e4 70
d5c5605c
JL
71/*
72 * cifs tcp session reconnection
73 *
74 * mark tcp session as reconnecting so temporarily locked
75 * mark all smb sessions as reconnecting for tcp session
76 * reconnect tcp session
77 * wake up waiters on reconnection? - (not needed currently)
78 */
2cd646a2 79static int
1da177e4
LT
80cifs_reconnect(struct TCP_Server_Info *server)
81{
82 int rc = 0;
f1987b44 83 struct list_head *tmp, *tmp2;
96daf2b0
SF
84 struct cifs_ses *ses;
85 struct cifs_tcon *tcon;
fb8c4b14 86 struct mid_q_entry *mid_entry;
3c1105df 87 struct list_head retry_list;
50c2f753 88
1da177e4 89 spin_lock(&GlobalMid_Lock);
469ee614 90 if (server->tcpStatus == CifsExiting) {
fb8c4b14 91 /* the demux thread will exit normally
1da177e4
LT
92 next time through the loop */
93 spin_unlock(&GlobalMid_Lock);
94 return rc;
95 } else
96 server->tcpStatus = CifsNeedReconnect;
97 spin_unlock(&GlobalMid_Lock);
98 server->maxBuf = 0;
99
b6b38f70 100 cFYI(1, "Reconnecting tcp session");
1da177e4
LT
101
102 /* before reconnecting the tcp session, mark the smb session (uid)
103 and the tid bad so they are not used until reconnected */
2b84a36c 104 cFYI(1, "%s: marking sessions and tcons for reconnect", __func__);
3f9bcca7 105 spin_lock(&cifs_tcp_ses_lock);
14fbf50d 106 list_for_each(tmp, &server->smb_ses_list) {
96daf2b0 107 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
14fbf50d
JL
108 ses->need_reconnect = true;
109 ses->ipc_tid = 0;
f1987b44 110 list_for_each(tmp2, &ses->tcon_list) {
96daf2b0 111 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
3b795210 112 tcon->need_reconnect = true;
1da177e4 113 }
1da177e4 114 }
3f9bcca7 115 spin_unlock(&cifs_tcp_ses_lock);
2b84a36c 116
1da177e4 117 /* do not want to be sending data on a socket we are freeing */
2b84a36c 118 cFYI(1, "%s: tearing down socket", __func__);
72ca545b 119 mutex_lock(&server->srv_mutex);
fb8c4b14 120 if (server->ssocket) {
b6b38f70
JP
121 cFYI(1, "State: 0x%x Flags: 0x%lx", server->ssocket->state,
122 server->ssocket->flags);
91cf45f0 123 kernel_sock_shutdown(server->ssocket, SHUT_WR);
b6b38f70 124 cFYI(1, "Post shutdown state: 0x%x Flags: 0x%lx",
467a8f8d 125 server->ssocket->state,
b6b38f70 126 server->ssocket->flags);
1da177e4
LT
127 sock_release(server->ssocket);
128 server->ssocket = NULL;
129 }
5d0d2882
SP
130 server->sequence_number = 0;
131 server->session_estab = false;
21e73393
SP
132 kfree(server->session_key.response);
133 server->session_key.response = NULL;
134 server->session_key.len = 0;
fda35943 135 server->lstrp = jiffies;
2b84a36c 136 mutex_unlock(&server->srv_mutex);
1da177e4 137
2b84a36c 138 /* mark submitted MIDs for retry and issue callback */
3c1105df
JL
139 INIT_LIST_HEAD(&retry_list);
140 cFYI(1, "%s: moving mids to private list", __func__);
1da177e4 141 spin_lock(&GlobalMid_Lock);
2b84a36c
JL
142 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
143 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
144 if (mid_entry->midState == MID_REQUEST_SUBMITTED)
ad8b15f0 145 mid_entry->midState = MID_RETRY_NEEDED;
3c1105df
JL
146 list_move(&mid_entry->qhead, &retry_list);
147 }
148 spin_unlock(&GlobalMid_Lock);
149
150 cFYI(1, "%s: issuing mid callbacks", __func__);
151 list_for_each_safe(tmp, tmp2, &retry_list) {
152 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
2b84a36c
JL
153 list_del_init(&mid_entry->qhead);
154 mid_entry->callback(mid_entry);
1da177e4 155 }
1da177e4 156
7fdbaa1b 157 do {
6c3d8909 158 try_to_freeze();
a9f1b85e
PS
159
160 /* we should try only the port we connected to before */
161 rc = generic_ip_connect(server);
fb8c4b14 162 if (rc) {
b6b38f70 163 cFYI(1, "reconnect error %d", rc);
0cb766ae 164 msleep(3000);
1da177e4
LT
165 } else {
166 atomic_inc(&tcpSesReconnectCount);
167 spin_lock(&GlobalMid_Lock);
469ee614 168 if (server->tcpStatus != CifsExiting)
fd88ce93 169 server->tcpStatus = CifsNeedNegotiate;
fb8c4b14 170 spin_unlock(&GlobalMid_Lock);
1da177e4 171 }
7fdbaa1b 172 } while (server->tcpStatus == CifsNeedReconnect);
2b84a36c 173
1da177e4
LT
174 return rc;
175}
176
fb8c4b14 177/*
e4eb295d
SF
178 return codes:
179 0 not a transact2, or all data present
180 >0 transact2 with that much data missing
181 -EINVAL = invalid transact2
182
183 */
c974befa 184static int check2ndT2(struct smb_hdr *pSMB)
e4eb295d 185{
fb8c4b14 186 struct smb_t2_rsp *pSMBt;
e4eb295d 187 int remaining;
26ec2548 188 __u16 total_data_size, data_in_this_rsp;
e4eb295d 189
fb8c4b14 190 if (pSMB->Command != SMB_COM_TRANSACTION2)
e4eb295d
SF
191 return 0;
192
fb8c4b14
SF
193 /* check for plausible wct, bcc and t2 data and parm sizes */
194 /* check for parm and data offset going beyond end of smb */
195 if (pSMB->WordCount != 10) { /* coalesce_t2 depends on this */
b6b38f70 196 cFYI(1, "invalid transact2 word count");
e4eb295d
SF
197 return -EINVAL;
198 }
199
200 pSMBt = (struct smb_t2_rsp *)pSMB;
201
26ec2548
JL
202 total_data_size = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount);
203 data_in_this_rsp = get_unaligned_le16(&pSMBt->t2_rsp.DataCount);
e4eb295d 204
c0c7b905 205 if (total_data_size == data_in_this_rsp)
e4eb295d 206 return 0;
c0c7b905 207 else if (total_data_size < data_in_this_rsp) {
b6b38f70
JP
208 cFYI(1, "total data %d smaller than data in frame %d",
209 total_data_size, data_in_this_rsp);
e4eb295d 210 return -EINVAL;
e4eb295d 211 }
c0c7b905
JL
212
213 remaining = total_data_size - data_in_this_rsp;
214
215 cFYI(1, "missing %d bytes from transact2, check next response",
216 remaining);
c974befa 217 if (total_data_size > CIFSMaxBufSize) {
c0c7b905 218 cERROR(1, "TotalDataSize %d is over maximum buffer %d",
c974befa 219 total_data_size, CIFSMaxBufSize);
c0c7b905
JL
220 return -EINVAL;
221 }
222 return remaining;
e4eb295d
SF
223}
224
fb8c4b14 225static int coalesce_t2(struct smb_hdr *psecond, struct smb_hdr *pTargetSMB)
e4eb295d
SF
226{
227 struct smb_t2_rsp *pSMB2 = (struct smb_t2_rsp *)psecond;
228 struct smb_t2_rsp *pSMBt = (struct smb_t2_rsp *)pTargetSMB;
fb8c4b14
SF
229 char *data_area_of_target;
230 char *data_area_of_buf2;
26ec2548 231 int remaining;
2a2047bc
JL
232 unsigned int byte_count, total_in_buf;
233 __u16 total_data_size, total_in_buf2;
e4eb295d 234
26ec2548 235 total_data_size = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount);
e4eb295d 236
26ec2548
JL
237 if (total_data_size !=
238 get_unaligned_le16(&pSMB2->t2_rsp.TotalDataCount))
b6b38f70 239 cFYI(1, "total data size of primary and secondary t2 differ");
e4eb295d 240
26ec2548 241 total_in_buf = get_unaligned_le16(&pSMBt->t2_rsp.DataCount);
e4eb295d
SF
242
243 remaining = total_data_size - total_in_buf;
50c2f753 244
fb8c4b14 245 if (remaining < 0)
2a2047bc 246 return -EPROTO;
e4eb295d 247
fb8c4b14 248 if (remaining == 0) /* nothing to do, ignore */
e4eb295d 249 return 0;
50c2f753 250
26ec2548 251 total_in_buf2 = get_unaligned_le16(&pSMB2->t2_rsp.DataCount);
fb8c4b14 252 if (remaining < total_in_buf2) {
b6b38f70 253 cFYI(1, "transact2 2nd response contains too much data");
e4eb295d
SF
254 }
255
256 /* find end of first SMB data area */
fb8c4b14 257 data_area_of_target = (char *)&pSMBt->hdr.Protocol +
26ec2548 258 get_unaligned_le16(&pSMBt->t2_rsp.DataOffset);
e4eb295d
SF
259 /* validate target area */
260
26ec2548
JL
261 data_area_of_buf2 = (char *)&pSMB2->hdr.Protocol +
262 get_unaligned_le16(&pSMB2->t2_rsp.DataOffset);
e4eb295d
SF
263
264 data_area_of_target += total_in_buf;
265
266 /* copy second buffer into end of first buffer */
e4eb295d 267 total_in_buf += total_in_buf2;
2a2047bc
JL
268 /* is the result too big for the field? */
269 if (total_in_buf > USHRT_MAX)
270 return -EPROTO;
26ec2548 271 put_unaligned_le16(total_in_buf, &pSMBt->t2_rsp.DataCount);
2a2047bc
JL
272
273 /* fix up the BCC */
820a803f 274 byte_count = get_bcc(pTargetSMB);
e4eb295d 275 byte_count += total_in_buf2;
2a2047bc
JL
276 /* is the result too big for the field? */
277 if (byte_count > USHRT_MAX)
278 return -EPROTO;
820a803f 279 put_bcc(byte_count, pTargetSMB);
e4eb295d 280
be8e3b00 281 byte_count = be32_to_cpu(pTargetSMB->smb_buf_length);
e4eb295d 282 byte_count += total_in_buf2;
2a2047bc
JL
283 /* don't allow buffer to overflow */
284 if (byte_count > CIFSMaxBufSize)
285 return -ENOBUFS;
be8e3b00 286 pTargetSMB->smb_buf_length = cpu_to_be32(byte_count);
e4eb295d 287
2a2047bc
JL
288 memcpy(data_area_of_target, data_area_of_buf2, total_in_buf2);
289
fb8c4b14 290 if (remaining == total_in_buf2) {
b6b38f70 291 cFYI(1, "found the last secondary response");
e4eb295d
SF
292 return 0; /* we are done */
293 } else /* more responses to go */
294 return 1;
e4eb295d
SF
295}
296
c74093b6
JL
297static void
298cifs_echo_request(struct work_struct *work)
299{
300 int rc;
301 struct TCP_Server_Info *server = container_of(work,
302 struct TCP_Server_Info, echo.work);
303
247ec9b4 304 /*
195291e6
JL
305 * We cannot send an echo until the NEGOTIATE_PROTOCOL request is
306 * done, which is indicated by maxBuf != 0. Also, no need to ping if
307 * we got a response recently
247ec9b4 308 */
195291e6 309 if (server->maxBuf == 0 ||
247ec9b4 310 time_before(jiffies, server->lstrp + SMB_ECHO_INTERVAL - HZ))
c74093b6
JL
311 goto requeue_echo;
312
313 rc = CIFSSMBEcho(server);
314 if (rc)
315 cFYI(1, "Unable to send echo request to server: %s",
316 server->hostname);
317
318requeue_echo:
319 queue_delayed_work(system_nrt_wq, &server->echo, SMB_ECHO_INTERVAL);
320}
321
3d9c2472 322static bool
2a37ef94 323allocate_buffers(struct TCP_Server_Info *server)
3d9c2472 324{
2a37ef94
JL
325 if (!server->bigbuf) {
326 server->bigbuf = (char *)cifs_buf_get();
327 if (!server->bigbuf) {
3d9c2472
PS
328 cERROR(1, "No memory for large SMB response");
329 msleep(3000);
330 /* retry will check if exiting */
331 return false;
332 }
2a37ef94 333 } else if (server->large_buf) {
3d9c2472 334 /* we are reusing a dirty large buf, clear its start */
2a37ef94 335 memset(server->bigbuf, 0, sizeof(struct smb_hdr));
3d9c2472
PS
336 }
337
2a37ef94
JL
338 if (!server->smallbuf) {
339 server->smallbuf = (char *)cifs_small_buf_get();
340 if (!server->smallbuf) {
3d9c2472
PS
341 cERROR(1, "No memory for SMB response");
342 msleep(1000);
343 /* retry will check if exiting */
344 return false;
345 }
346 /* beginning of smb buffer is cleared in our buf_get */
347 } else {
348 /* if existing small buf clear beginning */
2a37ef94 349 memset(server->smallbuf, 0, sizeof(struct smb_hdr));
3d9c2472
PS
350 }
351
3d9c2472
PS
352 return true;
353}
354
ba749e6d
JL
355static bool
356server_unresponsive(struct TCP_Server_Info *server)
357{
358 if (echo_retries > 0 && server->tcpStatus == CifsGood &&
359 time_after(jiffies, server->lstrp +
360 (echo_retries * SMB_ECHO_INTERVAL))) {
361 cERROR(1, "Server %s has not responded in %d seconds. "
362 "Reconnecting...", server->hostname,
363 (echo_retries * SMB_ECHO_INTERVAL / HZ));
364 cifs_reconnect(server);
365 wake_up(&server->response_q);
366 return true;
367 }
368
369 return false;
370}
371
42c4dfc2
JL
372/*
373 * kvec_array_init - clone a kvec array, and advance into it
374 * @new: pointer to memory for cloned array
375 * @iov: pointer to original array
376 * @nr_segs: number of members in original array
377 * @bytes: number of bytes to advance into the cloned array
378 *
379 * This function will copy the array provided in iov to a section of memory
380 * and advance the specified number of bytes into the new array. It returns
381 * the number of segments in the new array. "new" must be at least as big as
382 * the original iov array.
383 */
384static unsigned int
385kvec_array_init(struct kvec *new, struct kvec *iov, unsigned int nr_segs,
386 size_t bytes)
387{
388 size_t base = 0;
389
390 while (bytes || !iov->iov_len) {
391 int copy = min(bytes, iov->iov_len);
392
393 bytes -= copy;
394 base += copy;
395 if (iov->iov_len == base) {
396 iov++;
397 nr_segs--;
398 base = 0;
399 }
400 }
401 memcpy(new, iov, sizeof(*iov) * nr_segs);
402 new->iov_base += base;
403 new->iov_len -= base;
404 return nr_segs;
405}
406
1041e3f9
JL
407static struct kvec *
408get_server_iovec(struct TCP_Server_Info *server, unsigned int nr_segs)
409{
410 struct kvec *new_iov;
411
412 if (server->iov && nr_segs <= server->nr_iov)
413 return server->iov;
414
415 /* not big enough -- allocate a new one and release the old */
416 new_iov = kmalloc(sizeof(*new_iov) * nr_segs, GFP_NOFS);
417 if (new_iov) {
418 kfree(server->iov);
419 server->iov = new_iov;
420 server->nr_iov = nr_segs;
421 }
422 return new_iov;
423}
424
e7015fb1 425static int
42c4dfc2
JL
426readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig,
427 unsigned int nr_segs, unsigned int to_read)
e7015fb1 428{
a52c1eb7
JL
429 int length = 0;
430 int total_read;
42c4dfc2 431 unsigned int segs;
e831e6cf 432 struct msghdr smb_msg;
42c4dfc2
JL
433 struct kvec *iov;
434
1041e3f9 435 iov = get_server_iovec(server, nr_segs);
42c4dfc2
JL
436 if (!iov)
437 return -ENOMEM;
e7015fb1 438
e831e6cf
JL
439 smb_msg.msg_control = NULL;
440 smb_msg.msg_controllen = 0;
441
a52c1eb7 442 for (total_read = 0; to_read; total_read += length, to_read -= length) {
ba749e6d 443 if (server_unresponsive(server)) {
a52c1eb7 444 total_read = -EAGAIN;
ba749e6d
JL
445 break;
446 }
447
42c4dfc2
JL
448 segs = kvec_array_init(iov, iov_orig, nr_segs, total_read);
449
450 length = kernel_recvmsg(server->ssocket, &smb_msg,
451 iov, segs, to_read, 0);
452
e7015fb1 453 if (server->tcpStatus == CifsExiting) {
a52c1eb7 454 total_read = -ESHUTDOWN;
e7015fb1
PS
455 break;
456 } else if (server->tcpStatus == CifsNeedReconnect) {
457 cifs_reconnect(server);
a52c1eb7 458 total_read = -EAGAIN;
e7015fb1
PS
459 break;
460 } else if (length == -ERESTARTSYS ||
461 length == -EAGAIN ||
462 length == -EINTR) {
463 /*
464 * Minimum sleep to prevent looping, allowing socket
465 * to clear and app threads to set tcpStatus
466 * CifsNeedReconnect if server hung.
467 */
468 usleep_range(1000, 2000);
469 length = 0;
a52c1eb7 470 continue;
e7015fb1 471 } else if (length <= 0) {
a52c1eb7
JL
472 cFYI(1, "Received no data or error: expecting %d "
473 "got %d", to_read, length);
e7015fb1 474 cifs_reconnect(server);
a52c1eb7 475 total_read = -EAGAIN;
e7015fb1
PS
476 break;
477 }
478 }
a52c1eb7 479 return total_read;
e7015fb1
PS
480}
481
42c4dfc2
JL
482static int
483read_from_socket(struct TCP_Server_Info *server, char *buf,
484 unsigned int to_read)
485{
486 struct kvec iov;
487
488 iov.iov_base = buf;
489 iov.iov_len = to_read;
490
491 return readv_from_socket(server, &iov, 1, to_read);
492}
493
98bac62c 494static bool
fe11e4cc 495is_smb_response(struct TCP_Server_Info *server, unsigned char type)
98bac62c 496{
98bac62c
PS
497 /*
498 * The first byte big endian of the length field,
499 * is actually not part of the length but the type
500 * with the most common, zero, as regular data.
501 */
fe11e4cc
JL
502 switch (type) {
503 case RFC1002_SESSION_MESSAGE:
504 /* Regular SMB response */
505 return true;
506 case RFC1002_SESSION_KEEP_ALIVE:
507 cFYI(1, "RFC 1002 session keep alive");
508 break;
509 case RFC1002_POSITIVE_SESSION_RESPONSE:
510 cFYI(1, "RFC 1002 positive session response");
511 break;
512 case RFC1002_NEGATIVE_SESSION_RESPONSE:
98bac62c
PS
513 /*
514 * We get this from Windows 98 instead of an error on
515 * SMB negprot response.
516 */
fe11e4cc 517 cFYI(1, "RFC 1002 negative session response");
98bac62c
PS
518 /* give server a second to clean up */
519 msleep(1000);
520 /*
521 * Always try 445 first on reconnect since we get NACK
522 * on some if we ever connected to port 139 (the NACK
523 * is since we do not begin with RFC1001 session
524 * initialize frame).
525 */
fe11e4cc 526 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
98bac62c
PS
527 cifs_reconnect(server);
528 wake_up(&server->response_q);
fe11e4cc
JL
529 break;
530 default:
531 cERROR(1, "RFC 1002 unknown response type 0x%x", type);
98bac62c 532 cifs_reconnect(server);
98bac62c
PS
533 }
534
fe11e4cc 535 return false;
98bac62c
PS
536}
537
ad69bae1 538static struct mid_q_entry *
ea1f4502 539find_mid(struct TCP_Server_Info *server, struct smb_hdr *buf)
ad69bae1 540{
ea1f4502 541 struct mid_q_entry *mid;
ad69bae1
PS
542
543 spin_lock(&GlobalMid_Lock);
ea1f4502
JL
544 list_for_each_entry(mid, &server->pending_mid_q, qhead) {
545 if (mid->mid == buf->Mid &&
546 mid->midState == MID_REQUEST_SUBMITTED &&
547 mid->command == buf->Command) {
548 spin_unlock(&GlobalMid_Lock);
549 return mid;
ad69bae1 550 }
ea1f4502
JL
551 }
552 spin_unlock(&GlobalMid_Lock);
553 return NULL;
554}
555
556static void
557dequeue_mid(struct mid_q_entry *mid, int malformed)
558{
ad69bae1 559#ifdef CONFIG_CIFS_STATS2
ea1f4502 560 mid->when_received = jiffies;
ad69bae1 561#endif
ea1f4502
JL
562 spin_lock(&GlobalMid_Lock);
563 if (!malformed)
564 mid->midState = MID_RESPONSE_RECEIVED;
565 else
566 mid->midState = MID_RESPONSE_MALFORMED;
567 list_del_init(&mid->qhead);
ad69bae1 568 spin_unlock(&GlobalMid_Lock);
ea1f4502 569}
ad69bae1 570
c8054ebd
JL
571static void
572handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
573 struct smb_hdr *buf, int malformed)
ea1f4502 574{
ffc00e27
JL
575 if (malformed == 0 && check2ndT2(buf) > 0) {
576 mid->multiRsp = true;
ea1f4502
JL
577 if (mid->resp_buf) {
578 /* merge response - fix up 1st*/
ffc00e27
JL
579 malformed = coalesce_t2(buf, mid->resp_buf);
580 if (malformed > 0)
c8054ebd 581 return;
ffc00e27 582
ea1f4502
JL
583 /* All parts received or packet is malformed. */
584 mid->multiEnd = true;
c8054ebd 585 return dequeue_mid(mid, malformed);
ea1f4502 586 }
2a37ef94 587 if (!server->large_buf) {
ea1f4502
JL
588 /*FIXME: switch to already allocated largebuf?*/
589 cERROR(1, "1st trans2 resp needs bigbuf");
590 } else {
591 /* Have first buffer */
592 mid->resp_buf = buf;
593 mid->largeBuf = true;
2a37ef94 594 server->bigbuf = NULL;
ea1f4502 595 }
c8054ebd 596 return;
ea1f4502
JL
597 }
598 mid->resp_buf = buf;
2a37ef94
JL
599 mid->largeBuf = server->large_buf;
600 /* Was previous buf put in mpx struct for multi-rsp? */
601 if (!mid->multiRsp) {
602 /* smb buffer will be freed by user thread */
603 if (server->large_buf)
604 server->bigbuf = NULL;
605 else
606 server->smallbuf = NULL;
607 }
ffc00e27 608 dequeue_mid(mid, malformed);
ad69bae1
PS
609}
610
762dfd10
PS
611static void clean_demultiplex_info(struct TCP_Server_Info *server)
612{
613 int length;
614
615 /* take it off the list, if it's not already */
616 spin_lock(&cifs_tcp_ses_lock);
617 list_del_init(&server->tcp_ses_list);
618 spin_unlock(&cifs_tcp_ses_lock);
619
620 spin_lock(&GlobalMid_Lock);
621 server->tcpStatus = CifsExiting;
622 spin_unlock(&GlobalMid_Lock);
623 wake_up_all(&server->response_q);
624
625 /*
626 * Check if we have blocked requests that need to free. Note that
627 * cifs_max_pending is normally 50, but can be set at module install
628 * time to as little as two.
629 */
630 spin_lock(&GlobalMid_Lock);
631 if (atomic_read(&server->inFlight) >= cifs_max_pending)
632 atomic_set(&server->inFlight, cifs_max_pending - 1);
633 /*
634 * We do not want to set the max_pending too low or we could end up
635 * with the counter going negative.
636 */
637 spin_unlock(&GlobalMid_Lock);
638 /*
639 * Although there should not be any requests blocked on this queue it
640 * can not hurt to be paranoid and try to wake up requests that may
641 * haven been blocked when more than 50 at time were on the wire to the
642 * same server - they now will see the session is in exit state and get
643 * out of SendReceive.
644 */
645 wake_up_all(&server->request_q);
646 /* give those requests time to exit */
647 msleep(125);
648
649 if (server->ssocket) {
650 sock_release(server->ssocket);
651 server->ssocket = NULL;
652 }
653
654 if (!list_empty(&server->pending_mid_q)) {
655 struct list_head dispose_list;
656 struct mid_q_entry *mid_entry;
657 struct list_head *tmp, *tmp2;
658
659 INIT_LIST_HEAD(&dispose_list);
660 spin_lock(&GlobalMid_Lock);
661 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
662 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
663 cFYI(1, "Clearing mid 0x%x", mid_entry->mid);
664 mid_entry->midState = MID_SHUTDOWN;
665 list_move(&mid_entry->qhead, &dispose_list);
666 }
667 spin_unlock(&GlobalMid_Lock);
668
669 /* now walk dispose list and issue callbacks */
670 list_for_each_safe(tmp, tmp2, &dispose_list) {
671 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
672 cFYI(1, "Callback mid 0x%x", mid_entry->mid);
673 list_del_init(&mid_entry->qhead);
674 mid_entry->callback(mid_entry);
675 }
676 /* 1/8th of sec is more than enough time for them to exit */
677 msleep(125);
678 }
679
680 if (!list_empty(&server->pending_mid_q)) {
681 /*
682 * mpx threads have not exited yet give them at least the smb
683 * send timeout time for long ops.
684 *
685 * Due to delays on oplock break requests, we need to wait at
686 * least 45 seconds before giving up on a request getting a
687 * response and going ahead and killing cifsd.
688 */
689 cFYI(1, "Wait for exit from demultiplex thread");
690 msleep(46000);
691 /*
692 * If threads still have not exited they are probably never
693 * coming home not much else we can do but free the memory.
694 */
695 }
696
697 kfree(server->hostname);
1041e3f9 698 kfree(server->iov);
762dfd10
PS
699 kfree(server);
700
701 length = atomic_dec_return(&tcpSesAllocCount);
702 if (length > 0)
703 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
704 GFP_KERNEL);
705}
706
1da177e4 707static int
7c97c200 708cifs_demultiplex_thread(void *p)
1da177e4
LT
709{
710 int length;
7c97c200 711 struct TCP_Server_Info *server = p;
2a37ef94
JL
712 unsigned int pdu_length;
713 char *buf = NULL;
1da177e4 714 struct smb_hdr *smb_buffer = NULL;
1da177e4
LT
715 struct task_struct *task_to_wake = NULL;
716 struct mid_q_entry *mid_entry;
1da177e4 717
1da177e4 718 current->flags |= PF_MEMALLOC;
b6b38f70 719 cFYI(1, "Demultiplex PID: %d", task_pid_nr(current));
93d0ec85
JL
720
721 length = atomic_inc_return(&tcpSesAllocCount);
722 if (length > 1)
26f57364
SF
723 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
724 GFP_KERNEL);
1da177e4 725
83144186 726 set_freezable();
469ee614 727 while (server->tcpStatus != CifsExiting) {
ede1327e
SF
728 if (try_to_freeze())
729 continue;
b8643e1b 730
2a37ef94 731 if (!allocate_buffers(server))
3d9c2472 732 continue;
b8643e1b 733
2a37ef94
JL
734 server->large_buf = false;
735 smb_buffer = (struct smb_hdr *)server->smallbuf;
736 buf = server->smallbuf;
f01d5e14 737 pdu_length = 4; /* enough to get RFC1001 header */
fda35943 738
a52c1eb7
JL
739 length = read_from_socket(server, buf, pdu_length);
740 if (length < 0)
1da177e4 741 continue;
2a37ef94 742 server->total_read = length;
1da177e4 743
98bac62c
PS
744 /*
745 * The right amount was read from socket - 4 bytes,
746 * so we can now interpret the length field.
747 */
be8e3b00 748 pdu_length = be32_to_cpu(smb_buffer->smb_buf_length);
70ca734a 749
fe11e4cc
JL
750 cFYI(1, "RFC1002 header 0x%x", pdu_length);
751 if (!is_smb_response(server, buf[0]))
fb8c4b14 752 continue;
e4eb295d 753
89482a56
JL
754 /* make sure we have enough to get to the MID */
755 if (pdu_length < sizeof(struct smb_hdr) - 1 - 4) {
756 cERROR(1, "SMB response too short (%u bytes)",
757 pdu_length);
758 cifs_reconnect(server);
759 wake_up(&server->response_q);
760 continue;
761 }
762
763 /* read down to the MID */
764 length = read_from_socket(server, buf + 4,
765 sizeof(struct smb_hdr) - 1 - 4);
766 if (length < 0)
767 continue;
2a37ef94 768 server->total_read += length;
89482a56 769
c8054ebd
JL
770 mid_entry = find_mid(server, smb_buffer);
771
89482a56
JL
772 if (pdu_length > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) {
773 cERROR(1, "SMB response too long (%u bytes)",
774 pdu_length);
fe11e4cc
JL
775 cifs_reconnect(server);
776 wake_up(&server->response_q);
777 continue;
778 }
779
e4eb295d 780 /* else length ok */
fb8c4b14 781 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
2a37ef94
JL
782 server->large_buf = true;
783 memcpy(server->bigbuf, server->smallbuf,
784 server->total_read);
785 smb_buffer = (struct smb_hdr *)server->bigbuf;
786 buf = server->bigbuf;
e4eb295d 787 }
e7015fb1 788
89482a56
JL
789 /* now read the rest */
790 length = read_from_socket(server,
791 buf + sizeof(struct smb_hdr) - 1,
792 pdu_length - sizeof(struct smb_hdr) + 1 + 4);
a52c1eb7 793 if (length < 0)
e4eb295d 794 continue;
2a37ef94 795 server->total_read += length;
50c2f753 796
2a37ef94 797 dump_smb(smb_buffer, server->total_read);
71823baf
JL
798
799 /*
800 * We know that we received enough to get to the MID as we
801 * checked the pdu_length earlier. Now check to see
802 * if the rest of the header is OK. We borrow the length
803 * var for the rest of the loop to avoid a new stack var.
804 *
805 * 48 bytes is enough to display the header and a little bit
806 * into the payload for debugging purposes.
807 */
2a37ef94
JL
808 length = checkSMB(smb_buffer, smb_buffer->Mid,
809 server->total_read);
71823baf 810 if (length != 0)
3d9c2472 811 cifs_dump_mem("Bad SMB: ", buf,
2a37ef94 812 min_t(unsigned int, server->total_read, 48));
1da177e4 813
fda35943
SF
814 server->lstrp = jiffies;
815
2b84a36c 816 if (mid_entry != NULL) {
c8054ebd 817 handle_mid(mid_entry, server, smb_buffer, length);
2a37ef94
JL
818 if (!mid_entry->multiRsp || mid_entry->multiEnd)
819 mid_entry->callback(mid_entry);
71823baf
JL
820 } else if (length != 0) {
821 /* response sanity checks failed */
822 continue;
ffc00e27 823 } else if (!is_valid_oplock_break(smb_buffer, server)) {
b6b38f70 824 cERROR(1, "No task to wake, unknown frame received! "
8097531a 825 "NumMids %d", atomic_read(&midCount));
3d9c2472 826 cifs_dump_mem("Received Data is: ", buf,
70ca734a 827 sizeof(struct smb_hdr));
3979877e
SF
828#ifdef CONFIG_CIFS_DEBUG2
829 cifs_dump_detail(smb_buffer);
830 cifs_dump_mids(server);
831#endif /* CIFS_DEBUG2 */
50c2f753 832
e4eb295d
SF
833 }
834 } /* end while !EXITING */
835
fd62cb7e 836 /* buffer usually freed in free_mid - need to free it here on exit */
2a37ef94
JL
837 cifs_buf_release(server->bigbuf);
838 if (server->smallbuf) /* no sense logging a debug message if NULL */
839 cifs_small_buf_release(server->smallbuf);
1da177e4 840
b1c8d2b4 841 task_to_wake = xchg(&server->tsk, NULL);
762dfd10 842 clean_demultiplex_info(server);
50c2f753 843
b1c8d2b4
JL
844 /* if server->tsk was NULL then wait for a signal before exiting */
845 if (!task_to_wake) {
846 set_current_state(TASK_INTERRUPTIBLE);
847 while (!signal_pending(current)) {
848 schedule();
849 set_current_state(TASK_INTERRUPTIBLE);
850 }
851 set_current_state(TASK_RUNNING);
852 }
853
0468a2cf 854 module_put_and_exit(0);
1da177e4
LT
855}
856
c359cf3c
JL
857/* extract the host portion of the UNC string */
858static char *
859extract_hostname(const char *unc)
860{
861 const char *src;
862 char *dst, *delim;
863 unsigned int len;
864
865 /* skip double chars at beginning of string */
866 /* BB: check validity of these bytes? */
867 src = unc + 2;
868
869 /* delimiter between hostname and sharename is always '\\' now */
870 delim = strchr(src, '\\');
871 if (!delim)
872 return ERR_PTR(-EINVAL);
873
874 len = delim - src;
875 dst = kmalloc((len + 1), GFP_KERNEL);
876 if (dst == NULL)
877 return ERR_PTR(-ENOMEM);
878
879 memcpy(dst, src, len);
880 dst[len] = '\0';
881
882 return dst;
883}
884
1da177e4 885static int
b946845a 886cifs_parse_mount_options(const char *mountdata, const char *devname,
50c2f753 887 struct smb_vol *vol)
1da177e4 888{
4906e50b 889 char *value, *data, *end;
957df453 890 char *mountdata_copy = NULL, *options;
3d3ea8e6 891 int err;
1da177e4
LT
892 unsigned int temp_len, i, j;
893 char separator[2];
9b9d6b24
JL
894 short int override_uid = -1;
895 short int override_gid = -1;
896 bool uid_specified = false;
897 bool gid_specified = false;
88463999 898 char *nodename = utsname()->nodename;
1da177e4
LT
899
900 separator[0] = ',';
50c2f753 901 separator[1] = 0;
1da177e4 902
88463999
JL
903 /*
904 * does not have to be perfect mapping since field is
905 * informational, only used for servers that do not support
906 * port 445 and it can be overridden at mount time
907 */
1397f2ee
JL
908 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
909 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
88463999
JL
910 vol->source_rfc1001_name[i] = toupper(nodename[i]);
911
1397f2ee 912 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
a10faeb2
SF
913 /* null target name indicates to use *SMBSERVR default called name
914 if we end up sending RFC1001 session initialize */
915 vol->target_rfc1001_name[0] = 0;
3e4b3e1f
JL
916 vol->cred_uid = current_uid();
917 vol->linux_uid = current_uid();
a001e5b5 918 vol->linux_gid = current_gid();
f55ed1a8
JL
919
920 /* default to only allowing write access to owner of the mount */
921 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1da177e4
LT
922
923 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
ac67055e
JA
924 /* default is always to request posix paths. */
925 vol->posix_paths = 1;
a0c9217f
JL
926 /* default to using server inode numbers where available */
927 vol->server_ino = 1;
ac67055e 928
6d20e840
SJ
929 vol->actimeo = CIFS_DEF_ACTIMEO;
930
b946845a
SF
931 if (!mountdata)
932 goto cifs_parse_mount_err;
933
934 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
935 if (!mountdata_copy)
936 goto cifs_parse_mount_err;
1da177e4 937
b946845a 938 options = mountdata_copy;
4906e50b 939 end = options + strlen(options);
50c2f753 940 if (strncmp(options, "sep=", 4) == 0) {
fb8c4b14 941 if (options[4] != 0) {
1da177e4
LT
942 separator[0] = options[4];
943 options += 5;
944 } else {
b6b38f70 945 cFYI(1, "Null separator not allowed");
1da177e4
LT
946 }
947 }
3d3ea8e6
SP
948 vol->backupuid_specified = false; /* no backup intent for a user */
949 vol->backupgid_specified = false; /* no backup intent for a group */
50c2f753 950
1da177e4
LT
951 while ((data = strsep(&options, separator)) != NULL) {
952 if (!*data)
953 continue;
954 if ((value = strchr(data, '=')) != NULL)
955 *value++ = '\0';
956
50c2f753
SF
957 /* Have to parse this before we parse for "user" */
958 if (strnicmp(data, "user_xattr", 10) == 0) {
1da177e4 959 vol->no_xattr = 0;
50c2f753 960 } else if (strnicmp(data, "nouser_xattr", 12) == 0) {
1da177e4
LT
961 vol->no_xattr = 1;
962 } else if (strnicmp(data, "user", 4) == 0) {
4b952a9b 963 if (!value) {
1da177e4
LT
964 printk(KERN_WARNING
965 "CIFS: invalid or missing username\n");
b946845a 966 goto cifs_parse_mount_err;
fb8c4b14 967 } else if (!*value) {
4b952a9b
SF
968 /* null user, ie anonymous, authentication */
969 vol->nullauth = 1;
1da177e4 970 }
8727c8a8
SF
971 if (strnlen(value, MAX_USERNAME_SIZE) <
972 MAX_USERNAME_SIZE) {
b946845a
SF
973 vol->username = kstrdup(value, GFP_KERNEL);
974 if (!vol->username) {
975 printk(KERN_WARNING "CIFS: no memory "
976 "for username\n");
977 goto cifs_parse_mount_err;
978 }
1da177e4
LT
979 } else {
980 printk(KERN_WARNING "CIFS: username too long\n");
b946845a 981 goto cifs_parse_mount_err;
1da177e4
LT
982 }
983 } else if (strnicmp(data, "pass", 4) == 0) {
984 if (!value) {
985 vol->password = NULL;
986 continue;
fb8c4b14 987 } else if (value[0] == 0) {
1da177e4
LT
988 /* check if string begins with double comma
989 since that would mean the password really
990 does start with a comma, and would not
991 indicate an empty string */
fb8c4b14 992 if (value[1] != separator[0]) {
1da177e4
LT
993 vol->password = NULL;
994 continue;
995 }
996 }
997 temp_len = strlen(value);
998 /* removed password length check, NTLM passwords
999 can be arbitrarily long */
1000
50c2f753 1001 /* if comma in password, the string will be
1da177e4
LT
1002 prematurely null terminated. Commas in password are
1003 specified across the cifs mount interface by a double
1004 comma ie ,, and a comma used as in other cases ie ','
1005 as a parameter delimiter/separator is single and due
1006 to the strsep above is temporarily zeroed. */
1007
1008 /* NB: password legally can have multiple commas and
1009 the only illegal character in a password is null */
1010
50c2f753 1011 if ((value[temp_len] == 0) &&
4906e50b 1012 (value + temp_len < end) &&
09d1db5c 1013 (value[temp_len+1] == separator[0])) {
1da177e4
LT
1014 /* reinsert comma */
1015 value[temp_len] = separator[0];
50c2f753
SF
1016 temp_len += 2; /* move after second comma */
1017 while (value[temp_len] != 0) {
1da177e4 1018 if (value[temp_len] == separator[0]) {
50c2f753 1019 if (value[temp_len+1] ==
09d1db5c
SF
1020 separator[0]) {
1021 /* skip second comma */
1022 temp_len++;
50c2f753 1023 } else {
1da177e4
LT
1024 /* single comma indicating start
1025 of next parm */
1026 break;
1027 }
1028 }
1029 temp_len++;
1030 }
fb8c4b14 1031 if (value[temp_len] == 0) {
1da177e4
LT
1032 options = NULL;
1033 } else {
1034 value[temp_len] = 0;
1035 /* point option to start of next parm */
1036 options = value + temp_len + 1;
1037 }
50c2f753 1038 /* go from value to value + temp_len condensing
1da177e4
LT
1039 double commas to singles. Note that this ends up
1040 allocating a few bytes too many, which is ok */
e915fc49 1041 vol->password = kzalloc(temp_len, GFP_KERNEL);
fb8c4b14 1042 if (vol->password == NULL) {
50c2f753
SF
1043 printk(KERN_WARNING "CIFS: no memory "
1044 "for password\n");
b946845a 1045 goto cifs_parse_mount_err;
433dc24f 1046 }
50c2f753 1047 for (i = 0, j = 0; i < temp_len; i++, j++) {
1da177e4 1048 vol->password[j] = value[i];
fb8c4b14 1049 if (value[i] == separator[0]
09d1db5c 1050 && value[i+1] == separator[0]) {
1da177e4
LT
1051 /* skip second comma */
1052 i++;
1053 }
1054 }
1055 vol->password[j] = 0;
1056 } else {
e915fc49 1057 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
fb8c4b14 1058 if (vol->password == NULL) {
50c2f753
SF
1059 printk(KERN_WARNING "CIFS: no memory "
1060 "for password\n");
b946845a 1061 goto cifs_parse_mount_err;
433dc24f 1062 }
1da177e4
LT
1063 strcpy(vol->password, value);
1064 }
58f7f68f
JL
1065 } else if (!strnicmp(data, "ip", 2) ||
1066 !strnicmp(data, "addr", 4)) {
1da177e4
LT
1067 if (!value || !*value) {
1068 vol->UNCip = NULL;
50b64e3b
JL
1069 } else if (strnlen(value, INET6_ADDRSTRLEN) <
1070 INET6_ADDRSTRLEN) {
b946845a
SF
1071 vol->UNCip = kstrdup(value, GFP_KERNEL);
1072 if (!vol->UNCip) {
1073 printk(KERN_WARNING "CIFS: no memory "
1074 "for UNC IP\n");
1075 goto cifs_parse_mount_err;
1076 }
1da177e4 1077 } else {
50c2f753
SF
1078 printk(KERN_WARNING "CIFS: ip address "
1079 "too long\n");
b946845a 1080 goto cifs_parse_mount_err;
1da177e4 1081 }
50c2f753
SF
1082 } else if (strnicmp(data, "sec", 3) == 0) {
1083 if (!value || !*value) {
b6b38f70 1084 cERROR(1, "no security value specified");
50c2f753
SF
1085 continue;
1086 } else if (strnicmp(value, "krb5i", 5) == 0) {
1087 vol->secFlg |= CIFSSEC_MAY_KRB5 |
189acaae 1088 CIFSSEC_MUST_SIGN;
bf820679 1089 } else if (strnicmp(value, "krb5p", 5) == 0) {
50c2f753
SF
1090 /* vol->secFlg |= CIFSSEC_MUST_SEAL |
1091 CIFSSEC_MAY_KRB5; */
b6b38f70 1092 cERROR(1, "Krb5 cifs privacy not supported");
b946845a 1093 goto cifs_parse_mount_err;
bf820679 1094 } else if (strnicmp(value, "krb5", 4) == 0) {
750d1151 1095 vol->secFlg |= CIFSSEC_MAY_KRB5;
ac683924
SF
1096 } else if (strnicmp(value, "ntlmsspi", 8) == 0) {
1097 vol->secFlg |= CIFSSEC_MAY_NTLMSSP |
1098 CIFSSEC_MUST_SIGN;
1099 } else if (strnicmp(value, "ntlmssp", 7) == 0) {
1100 vol->secFlg |= CIFSSEC_MAY_NTLMSSP;
bf820679 1101 } else if (strnicmp(value, "ntlmv2i", 7) == 0) {
750d1151 1102 vol->secFlg |= CIFSSEC_MAY_NTLMV2 |
189acaae 1103 CIFSSEC_MUST_SIGN;
bf820679 1104 } else if (strnicmp(value, "ntlmv2", 6) == 0) {
750d1151 1105 vol->secFlg |= CIFSSEC_MAY_NTLMV2;
bf820679 1106 } else if (strnicmp(value, "ntlmi", 5) == 0) {
750d1151 1107 vol->secFlg |= CIFSSEC_MAY_NTLM |
189acaae 1108 CIFSSEC_MUST_SIGN;
bf820679
SF
1109 } else if (strnicmp(value, "ntlm", 4) == 0) {
1110 /* ntlm is default so can be turned off too */
750d1151 1111 vol->secFlg |= CIFSSEC_MAY_NTLM;
bf820679 1112 } else if (strnicmp(value, "nontlm", 6) == 0) {
189acaae 1113 /* BB is there a better way to do this? */
750d1151 1114 vol->secFlg |= CIFSSEC_MAY_NTLMV2;
189acaae
SF
1115#ifdef CONFIG_CIFS_WEAK_PW_HASH
1116 } else if (strnicmp(value, "lanman", 6) == 0) {
50c2f753 1117 vol->secFlg |= CIFSSEC_MAY_LANMAN;
189acaae 1118#endif
bf820679 1119 } else if (strnicmp(value, "none", 4) == 0) {
189acaae 1120 vol->nullauth = 1;
50c2f753 1121 } else {
b6b38f70 1122 cERROR(1, "bad security option: %s", value);
b946845a 1123 goto cifs_parse_mount_err;
50c2f753 1124 }
1cb06d0b
SF
1125 } else if (strnicmp(data, "vers", 3) == 0) {
1126 if (!value || !*value) {
1127 cERROR(1, "no protocol version specified"
1128 " after vers= mount option");
1129 } else if ((strnicmp(value, "cifs", 4) == 0) ||
1130 (strnicmp(value, "1", 1) == 0)) {
1131 /* this is the default */
1132 continue;
1cb06d0b 1133 }
1da177e4
LT
1134 } else if ((strnicmp(data, "unc", 3) == 0)
1135 || (strnicmp(data, "target", 6) == 0)
1136 || (strnicmp(data, "path", 4) == 0)) {
1137 if (!value || !*value) {
50c2f753
SF
1138 printk(KERN_WARNING "CIFS: invalid path to "
1139 "network resource\n");
b946845a 1140 goto cifs_parse_mount_err;
1da177e4
LT
1141 }
1142 if ((temp_len = strnlen(value, 300)) < 300) {
50c2f753 1143 vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
4523cc30 1144 if (vol->UNC == NULL)
b946845a 1145 goto cifs_parse_mount_err;
50c2f753 1146 strcpy(vol->UNC, value);
1da177e4
LT
1147 if (strncmp(vol->UNC, "//", 2) == 0) {
1148 vol->UNC[0] = '\\';
1149 vol->UNC[1] = '\\';
50c2f753 1150 } else if (strncmp(vol->UNC, "\\\\", 2) != 0) {
1da177e4 1151 printk(KERN_WARNING
50c2f753
SF
1152 "CIFS: UNC Path does not begin "
1153 "with // or \\\\ \n");
b946845a 1154 goto cifs_parse_mount_err;
1da177e4
LT
1155 }
1156 } else {
1157 printk(KERN_WARNING "CIFS: UNC name too long\n");
b946845a 1158 goto cifs_parse_mount_err;
1da177e4
LT
1159 }
1160 } else if ((strnicmp(data, "domain", 3) == 0)
1161 || (strnicmp(data, "workgroup", 5) == 0)) {
1162 if (!value || !*value) {
1163 printk(KERN_WARNING "CIFS: invalid domain name\n");
b946845a 1164 goto cifs_parse_mount_err;
1da177e4
LT
1165 }
1166 /* BB are there cases in which a comma can be valid in
1167 a domain name and need special handling? */
3979877e 1168 if (strnlen(value, 256) < 256) {
b946845a
SF
1169 vol->domainname = kstrdup(value, GFP_KERNEL);
1170 if (!vol->domainname) {
1171 printk(KERN_WARNING "CIFS: no memory "
1172 "for domainname\n");
1173 goto cifs_parse_mount_err;
1174 }
b6b38f70 1175 cFYI(1, "Domain name set");
1da177e4 1176 } else {
50c2f753
SF
1177 printk(KERN_WARNING "CIFS: domain name too "
1178 "long\n");
b946845a 1179 goto cifs_parse_mount_err;
1da177e4 1180 }
3eb9a889
BG
1181 } else if (strnicmp(data, "srcaddr", 7) == 0) {
1182 vol->srcaddr.ss_family = AF_UNSPEC;
1183
1184 if (!value || !*value) {
1185 printk(KERN_WARNING "CIFS: srcaddr value"
1186 " not specified.\n");
b946845a 1187 goto cifs_parse_mount_err;
3eb9a889
BG
1188 }
1189 i = cifs_convert_address((struct sockaddr *)&vol->srcaddr,
1190 value, strlen(value));
b235f371 1191 if (i == 0) {
3eb9a889
BG
1192 printk(KERN_WARNING "CIFS: Could not parse"
1193 " srcaddr: %s\n",
1194 value);
b946845a 1195 goto cifs_parse_mount_err;
3eb9a889 1196 }
50c2f753
SF
1197 } else if (strnicmp(data, "prefixpath", 10) == 0) {
1198 if (!value || !*value) {
1199 printk(KERN_WARNING
1200 "CIFS: invalid path prefix\n");
b946845a 1201 goto cifs_parse_mount_err;
50c2f753
SF
1202 }
1203 if ((temp_len = strnlen(value, 1024)) < 1024) {
4523cc30 1204 if (value[0] != '/')
2fe87f02 1205 temp_len++; /* missing leading slash */
50c2f753
SF
1206 vol->prepath = kmalloc(temp_len+1, GFP_KERNEL);
1207 if (vol->prepath == NULL)
b946845a 1208 goto cifs_parse_mount_err;
4523cc30 1209 if (value[0] != '/') {
2fe87f02 1210 vol->prepath[0] = '/';
50c2f753 1211 strcpy(vol->prepath+1, value);
2fe87f02 1212 } else
50c2f753 1213 strcpy(vol->prepath, value);
b6b38f70 1214 cFYI(1, "prefix path %s", vol->prepath);
50c2f753
SF
1215 } else {
1216 printk(KERN_WARNING "CIFS: prefix too long\n");
b946845a 1217 goto cifs_parse_mount_err;
50c2f753 1218 }
1da177e4
LT
1219 } else if (strnicmp(data, "iocharset", 9) == 0) {
1220 if (!value || !*value) {
63135e08
SF
1221 printk(KERN_WARNING "CIFS: invalid iocharset "
1222 "specified\n");
b946845a 1223 goto cifs_parse_mount_err;
1da177e4
LT
1224 }
1225 if (strnlen(value, 65) < 65) {
b946845a
SF
1226 if (strnicmp(value, "default", 7)) {
1227 vol->iocharset = kstrdup(value,
1228 GFP_KERNEL);
1229
1230 if (!vol->iocharset) {
1231 printk(KERN_WARNING "CIFS: no "
1232 "memory for"
1233 "charset\n");
1234 goto cifs_parse_mount_err;
1235 }
1236 }
50c2f753
SF
1237 /* if iocharset not set then load_nls_default
1238 is used by caller */
b6b38f70 1239 cFYI(1, "iocharset set to %s", value);
1da177e4 1240 } else {
63135e08
SF
1241 printk(KERN_WARNING "CIFS: iocharset name "
1242 "too long.\n");
b946845a 1243 goto cifs_parse_mount_err;
1da177e4 1244 }
9b9d6b24
JL
1245 } else if (!strnicmp(data, "uid", 3) && value && *value) {
1246 vol->linux_uid = simple_strtoul(value, &value, 0);
1247 uid_specified = true;
bd763319
JL
1248 } else if (!strnicmp(data, "cruid", 5) && value && *value) {
1249 vol->cred_uid = simple_strtoul(value, &value, 0);
9b9d6b24
JL
1250 } else if (!strnicmp(data, "forceuid", 8)) {
1251 override_uid = 1;
1252 } else if (!strnicmp(data, "noforceuid", 10)) {
1253 override_uid = 0;
1254 } else if (!strnicmp(data, "gid", 3) && value && *value) {
1255 vol->linux_gid = simple_strtoul(value, &value, 0);
1256 gid_specified = true;
1257 } else if (!strnicmp(data, "forcegid", 8)) {
1258 override_gid = 1;
1259 } else if (!strnicmp(data, "noforcegid", 10)) {
1260 override_gid = 0;
1da177e4
LT
1261 } else if (strnicmp(data, "file_mode", 4) == 0) {
1262 if (value && *value) {
1263 vol->file_mode =
1264 simple_strtoul(value, &value, 0);
1265 }
1266 } else if (strnicmp(data, "dir_mode", 4) == 0) {
1267 if (value && *value) {
1268 vol->dir_mode =
1269 simple_strtoul(value, &value, 0);
1270 }
1271 } else if (strnicmp(data, "dirmode", 4) == 0) {
1272 if (value && *value) {
1273 vol->dir_mode =
1274 simple_strtoul(value, &value, 0);
1275 }
1276 } else if (strnicmp(data, "port", 4) == 0) {
1277 if (value && *value) {
1278 vol->port =
1279 simple_strtoul(value, &value, 0);
1280 }
1281 } else if (strnicmp(data, "rsize", 5) == 0) {
1282 if (value && *value) {
1283 vol->rsize =
1284 simple_strtoul(value, &value, 0);
1285 }
1286 } else if (strnicmp(data, "wsize", 5) == 0) {
1287 if (value && *value) {
1288 vol->wsize =
1289 simple_strtoul(value, &value, 0);
1290 }
1291 } else if (strnicmp(data, "sockopt", 5) == 0) {
6a5fa236 1292 if (!value || !*value) {
b6b38f70 1293 cERROR(1, "no socket option specified");
6a5fa236
SF
1294 continue;
1295 } else if (strnicmp(value, "TCP_NODELAY", 11) == 0) {
1296 vol->sockopt_tcp_nodelay = 1;
1da177e4
LT
1297 }
1298 } else if (strnicmp(data, "netbiosname", 4) == 0) {
1299 if (!value || !*value || (*value == ' ')) {
b6b38f70 1300 cFYI(1, "invalid (empty) netbiosname");
1da177e4 1301 } else {
1397f2ee
JL
1302 memset(vol->source_rfc1001_name, 0x20,
1303 RFC1001_NAME_LEN);
1304 /*
1305 * FIXME: are there cases in which a comma can
1306 * be valid in workstation netbios name (and
1307 * need special handling)?
1308 */
1309 for (i = 0; i < RFC1001_NAME_LEN; i++) {
1310 /* don't ucase netbiosname for user */
50c2f753 1311 if (value[i] == 0)
1da177e4 1312 break;
1397f2ee 1313 vol->source_rfc1001_name[i] = value[i];
1da177e4
LT
1314 }
1315 /* The string has 16th byte zero still from
1316 set at top of the function */
1397f2ee 1317 if (i == RFC1001_NAME_LEN && value[i] != 0)
50c2f753
SF
1318 printk(KERN_WARNING "CIFS: netbiosname"
1319 " longer than 15 truncated.\n");
a10faeb2
SF
1320 }
1321 } else if (strnicmp(data, "servern", 7) == 0) {
1322 /* servernetbiosname specified override *SMBSERVER */
1323 if (!value || !*value || (*value == ' ')) {
b6b38f70 1324 cFYI(1, "empty server netbiosname specified");
a10faeb2
SF
1325 } else {
1326 /* last byte, type, is 0x20 for servr type */
1397f2ee
JL
1327 memset(vol->target_rfc1001_name, 0x20,
1328 RFC1001_NAME_LEN_WITH_NULL);
a10faeb2 1329
50c2f753 1330 for (i = 0; i < 15; i++) {
a10faeb2 1331 /* BB are there cases in which a comma can be
50c2f753
SF
1332 valid in this workstation netbios name
1333 (and need special handling)? */
a10faeb2 1334
50c2f753
SF
1335 /* user or mount helper must uppercase
1336 the netbiosname */
1337 if (value[i] == 0)
a10faeb2
SF
1338 break;
1339 else
50c2f753
SF
1340 vol->target_rfc1001_name[i] =
1341 value[i];
a10faeb2
SF
1342 }
1343 /* The string has 16th byte zero still from
1344 set at top of the function */
1397f2ee 1345 if (i == RFC1001_NAME_LEN && value[i] != 0)
50c2f753
SF
1346 printk(KERN_WARNING "CIFS: server net"
1347 "biosname longer than 15 truncated.\n");
1da177e4 1348 }
6d20e840
SJ
1349 } else if (strnicmp(data, "actimeo", 7) == 0) {
1350 if (value && *value) {
1351 vol->actimeo = HZ * simple_strtoul(value,
1352 &value, 0);
1353 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1354 cERROR(1, "CIFS: attribute cache"
1355 "timeout too large");
b946845a 1356 goto cifs_parse_mount_err;
6d20e840
SJ
1357 }
1358 }
1da177e4
LT
1359 } else if (strnicmp(data, "credentials", 4) == 0) {
1360 /* ignore */
1361 } else if (strnicmp(data, "version", 3) == 0) {
1362 /* ignore */
50c2f753 1363 } else if (strnicmp(data, "guest", 5) == 0) {
1da177e4 1364 /* ignore */
c9c7fa00 1365 } else if (strnicmp(data, "rw", 2) == 0 && strlen(data) == 2) {
71a394fa
SF
1366 /* ignore */
1367 } else if (strnicmp(data, "ro", 2) == 0) {
1368 /* ignore */
edf1ae40
SF
1369 } else if (strnicmp(data, "noblocksend", 11) == 0) {
1370 vol->noblocksnd = 1;
1371 } else if (strnicmp(data, "noautotune", 10) == 0) {
1372 vol->noautotune = 1;
1da177e4
LT
1373 } else if ((strnicmp(data, "suid", 4) == 0) ||
1374 (strnicmp(data, "nosuid", 6) == 0) ||
1375 (strnicmp(data, "exec", 4) == 0) ||
1376 (strnicmp(data, "noexec", 6) == 0) ||
1377 (strnicmp(data, "nodev", 5) == 0) ||
1378 (strnicmp(data, "noauto", 6) == 0) ||
1379 (strnicmp(data, "dev", 3) == 0)) {
1380 /* The mount tool or mount.cifs helper (if present)
50c2f753
SF
1381 uses these opts to set flags, and the flags are read
1382 by the kernel vfs layer before we get here (ie
1383 before read super) so there is no point trying to
1384 parse these options again and set anything and it
1385 is ok to just ignore them */
1da177e4 1386 continue;
1da177e4
LT
1387 } else if (strnicmp(data, "hard", 4) == 0) {
1388 vol->retry = 1;
1389 } else if (strnicmp(data, "soft", 4) == 0) {
1390 vol->retry = 0;
1391 } else if (strnicmp(data, "perm", 4) == 0) {
1392 vol->noperm = 0;
1393 } else if (strnicmp(data, "noperm", 6) == 0) {
1394 vol->noperm = 1;
6a0b4824
SF
1395 } else if (strnicmp(data, "mapchars", 8) == 0) {
1396 vol->remap = 1;
1397 } else if (strnicmp(data, "nomapchars", 10) == 0) {
1398 vol->remap = 0;
50c2f753
SF
1399 } else if (strnicmp(data, "sfu", 3) == 0) {
1400 vol->sfu_emul = 1;
1401 } else if (strnicmp(data, "nosfu", 5) == 0) {
1402 vol->sfu_emul = 0;
2c1b8615
SF
1403 } else if (strnicmp(data, "nodfs", 5) == 0) {
1404 vol->nodfs = 1;
ac67055e
JA
1405 } else if (strnicmp(data, "posixpaths", 10) == 0) {
1406 vol->posix_paths = 1;
1407 } else if (strnicmp(data, "noposixpaths", 12) == 0) {
1408 vol->posix_paths = 0;
c18c842b
SF
1409 } else if (strnicmp(data, "nounix", 6) == 0) {
1410 vol->no_linux_ext = 1;
1411 } else if (strnicmp(data, "nolinux", 7) == 0) {
1412 vol->no_linux_ext = 1;
50c2f753 1413 } else if ((strnicmp(data, "nocase", 6) == 0) ||
a10faeb2 1414 (strnicmp(data, "ignorecase", 10) == 0)) {
50c2f753 1415 vol->nocase = 1;
f636a348
JL
1416 } else if (strnicmp(data, "mand", 4) == 0) {
1417 /* ignore */
1418 } else if (strnicmp(data, "nomand", 6) == 0) {
1419 /* ignore */
1420 } else if (strnicmp(data, "_netdev", 7) == 0) {
1421 /* ignore */
c46fa8ac
SF
1422 } else if (strnicmp(data, "brl", 3) == 0) {
1423 vol->nobrl = 0;
50c2f753 1424 } else if ((strnicmp(data, "nobrl", 5) == 0) ||
1c955187 1425 (strnicmp(data, "nolock", 6) == 0)) {
c46fa8ac 1426 vol->nobrl = 1;
d3485d37
SF
1427 /* turn off mandatory locking in mode
1428 if remote locking is turned off since the
1429 local vfs will do advisory */
50c2f753
SF
1430 if (vol->file_mode ==
1431 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
d3485d37 1432 vol->file_mode = S_IALLUGO;
13a6e42a
SF
1433 } else if (strnicmp(data, "forcemandatorylock", 9) == 0) {
1434 /* will take the shorter form "forcemand" as well */
1435 /* This mount option will force use of mandatory
1436 (DOS/Windows style) byte range locks, instead of
1437 using posix advisory byte range locks, even if the
1438 Unix extensions are available and posix locks would
1439 be supported otherwise. If Unix extensions are not
1440 negotiated this has no effect since mandatory locks
1441 would be used (mandatory locks is all that those
1442 those servers support) */
1443 vol->mand_lock = 1;
1da177e4
LT
1444 } else if (strnicmp(data, "setuids", 7) == 0) {
1445 vol->setuids = 1;
1446 } else if (strnicmp(data, "nosetuids", 9) == 0) {
1447 vol->setuids = 0;
d0a9c078
JL
1448 } else if (strnicmp(data, "dynperm", 7) == 0) {
1449 vol->dynperm = true;
1450 } else if (strnicmp(data, "nodynperm", 9) == 0) {
1451 vol->dynperm = false;
1da177e4
LT
1452 } else if (strnicmp(data, "nohard", 6) == 0) {
1453 vol->retry = 0;
1454 } else if (strnicmp(data, "nosoft", 6) == 0) {
1455 vol->retry = 1;
1456 } else if (strnicmp(data, "nointr", 6) == 0) {
1457 vol->intr = 0;
1458 } else if (strnicmp(data, "intr", 4) == 0) {
1459 vol->intr = 1;
be652445
SF
1460 } else if (strnicmp(data, "nostrictsync", 12) == 0) {
1461 vol->nostrictsync = 1;
1462 } else if (strnicmp(data, "strictsync", 10) == 0) {
1463 vol->nostrictsync = 0;
50c2f753 1464 } else if (strnicmp(data, "serverino", 7) == 0) {
1da177e4 1465 vol->server_ino = 1;
50c2f753 1466 } else if (strnicmp(data, "noserverino", 9) == 0) {
1da177e4 1467 vol->server_ino = 0;
c9c7fa00 1468 } else if (strnicmp(data, "rwpidforward", 12) == 0) {
d4ffff1f 1469 vol->rwpidforward = 1;
50c2f753 1470 } else if (strnicmp(data, "cifsacl", 7) == 0) {
0a4b92c0
SF
1471 vol->cifs_acl = 1;
1472 } else if (strnicmp(data, "nocifsacl", 9) == 0) {
1473 vol->cifs_acl = 0;
50c2f753 1474 } else if (strnicmp(data, "acl", 3) == 0) {
1da177e4 1475 vol->no_psx_acl = 0;
50c2f753 1476 } else if (strnicmp(data, "noacl", 5) == 0) {
1da177e4 1477 vol->no_psx_acl = 1;
84210e91
SF
1478 } else if (strnicmp(data, "locallease", 6) == 0) {
1479 vol->local_lease = 1;
50c2f753 1480 } else if (strnicmp(data, "sign", 4) == 0) {
750d1151 1481 vol->secFlg |= CIFSSEC_MUST_SIGN;
95b1cb90
SF
1482 } else if (strnicmp(data, "seal", 4) == 0) {
1483 /* we do not do the following in secFlags because seal
1484 is a per tree connection (mount) not a per socket
1485 or per-smb connection option in the protocol */
1486 /* vol->secFlg |= CIFSSEC_MUST_SEAL; */
1487 vol->seal = 1;
50c2f753 1488 } else if (strnicmp(data, "direct", 6) == 0) {
1da177e4 1489 vol->direct_io = 1;
50c2f753 1490 } else if (strnicmp(data, "forcedirectio", 13) == 0) {
1da177e4 1491 vol->direct_io = 1;
d39454ff
PS
1492 } else if (strnicmp(data, "strictcache", 11) == 0) {
1493 vol->strict_io = 1;
1da177e4 1494 } else if (strnicmp(data, "noac", 4) == 0) {
50c2f753
SF
1495 printk(KERN_WARNING "CIFS: Mount option noac not "
1496 "supported. Instead set "
1497 "/proc/fs/cifs/LookupCacheEnabled to 0\n");
fa1df75d 1498 } else if (strnicmp(data, "fsc", 3) == 0) {
607a569d 1499#ifndef CONFIG_CIFS_FSCACHE
83fb086e 1500 cERROR(1, "FS-Cache support needs CONFIG_CIFS_FSCACHE "
607a569d 1501 "kernel config option set");
b946845a 1502 goto cifs_parse_mount_err;
607a569d 1503#endif
fa1df75d 1504 vol->fsc = true;
736a3320
SM
1505 } else if (strnicmp(data, "mfsymlinks", 10) == 0) {
1506 vol->mfsymlinks = true;
0eb8a132
JL
1507 } else if (strnicmp(data, "multiuser", 8) == 0) {
1508 vol->multiuser = true;
3d3ea8e6
SP
1509 } else if (!strnicmp(data, "backupuid", 9) && value && *value) {
1510 err = kstrtouint(value, 0, &vol->backupuid);
1511 if (err < 0) {
1512 cERROR(1, "%s: Invalid backupuid value",
1513 __func__);
1514 goto cifs_parse_mount_err;
1515 }
1516 vol->backupuid_specified = true;
1517 } else if (!strnicmp(data, "backupgid", 9) && value && *value) {
1518 err = kstrtouint(value, 0, &vol->backupgid);
1519 if (err < 0) {
1520 cERROR(1, "%s: Invalid backupgid value",
1521 __func__);
1522 goto cifs_parse_mount_err;
1523 }
1524 vol->backupgid_specified = true;
1da177e4 1525 } else
50c2f753
SF
1526 printk(KERN_WARNING "CIFS: Unknown mount option %s\n",
1527 data);
1da177e4
LT
1528 }
1529 if (vol->UNC == NULL) {
4523cc30 1530 if (devname == NULL) {
50c2f753
SF
1531 printk(KERN_WARNING "CIFS: Missing UNC name for mount "
1532 "target\n");
b946845a 1533 goto cifs_parse_mount_err;
1da177e4
LT
1534 }
1535 if ((temp_len = strnlen(devname, 300)) < 300) {
50c2f753 1536 vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
4523cc30 1537 if (vol->UNC == NULL)
b946845a 1538 goto cifs_parse_mount_err;
50c2f753 1539 strcpy(vol->UNC, devname);
1da177e4
LT
1540 if (strncmp(vol->UNC, "//", 2) == 0) {
1541 vol->UNC[0] = '\\';
1542 vol->UNC[1] = '\\';
1543 } else if (strncmp(vol->UNC, "\\\\", 2) != 0) {
50c2f753
SF
1544 printk(KERN_WARNING "CIFS: UNC Path does not "
1545 "begin with // or \\\\ \n");
b946845a 1546 goto cifs_parse_mount_err;
1da177e4 1547 }
7c5e628f
IM
1548 value = strpbrk(vol->UNC+2, "/\\");
1549 if (value)
1550 *value = '\\';
1da177e4
LT
1551 } else {
1552 printk(KERN_WARNING "CIFS: UNC name too long\n");
b946845a 1553 goto cifs_parse_mount_err;
1da177e4
LT
1554 }
1555 }
0eb8a132
JL
1556
1557 if (vol->multiuser && !(vol->secFlg & CIFSSEC_MAY_KRB5)) {
1558 cERROR(1, "Multiuser mounts currently require krb5 "
1559 "authentication!");
b946845a 1560 goto cifs_parse_mount_err;
0eb8a132
JL
1561 }
1562
fb8c4b14 1563 if (vol->UNCip == NULL)
1da177e4
LT
1564 vol->UNCip = &vol->UNC[2];
1565
9b9d6b24
JL
1566 if (uid_specified)
1567 vol->override_uid = override_uid;
1568 else if (override_uid == 1)
1569 printk(KERN_NOTICE "CIFS: ignoring forceuid mount option "
1570 "specified with no uid= option.\n");
1571
1572 if (gid_specified)
1573 vol->override_gid = override_gid;
1574 else if (override_gid == 1)
1575 printk(KERN_NOTICE "CIFS: ignoring forcegid mount option "
1576 "specified with no gid= option.\n");
1577
b946845a 1578 kfree(mountdata_copy);
1da177e4 1579 return 0;
b946845a
SF
1580
1581cifs_parse_mount_err:
1582 kfree(mountdata_copy);
1583 return 1;
1da177e4
LT
1584}
1585
3eb9a889
BG
1586/** Returns true if srcaddr isn't specified and rhs isn't
1587 * specified, or if srcaddr is specified and
1588 * matches the IP address of the rhs argument.
1589 */
1590static bool
1591srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
1592{
1593 switch (srcaddr->sa_family) {
1594 case AF_UNSPEC:
1595 return (rhs->sa_family == AF_UNSPEC);
1596 case AF_INET: {
1597 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
1598 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
1599 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
1600 }
1601 case AF_INET6: {
1602 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
1603 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)&rhs;
1604 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
1605 }
1606 default:
1607 WARN_ON(1);
1608 return false; /* don't expect to be here */
1609 }
1610}
1611
4b886136
PS
1612/*
1613 * If no port is specified in addr structure, we try to match with 445 port
1614 * and if it fails - with 139 ports. It should be called only if address
1615 * families of server and addr are equal.
1616 */
1617static bool
1618match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1619{
6da97910 1620 __be16 port, *sport;
4b886136
PS
1621
1622 switch (addr->sa_family) {
1623 case AF_INET:
1624 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1625 port = ((struct sockaddr_in *) addr)->sin_port;
1626 break;
1627 case AF_INET6:
1628 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1629 port = ((struct sockaddr_in6 *) addr)->sin6_port;
1630 break;
1631 default:
1632 WARN_ON(1);
1633 return false;
1634 }
1635
1636 if (!port) {
1637 port = htons(CIFS_PORT);
1638 if (port == *sport)
1639 return true;
1640
1641 port = htons(RFC1001_PORT);
1642 }
1643
1644 return port == *sport;
1645}
3eb9a889 1646
4515148e 1647static bool
3eb9a889
BG
1648match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
1649 struct sockaddr *srcaddr)
4515148e 1650{
4515148e 1651 switch (addr->sa_family) {
a9f1b85e
PS
1652 case AF_INET: {
1653 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1654 struct sockaddr_in *srv_addr4 =
1655 (struct sockaddr_in *)&server->dstaddr;
1656
1657 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
4515148e 1658 return false;
4515148e 1659 break;
a9f1b85e
PS
1660 }
1661 case AF_INET6: {
1662 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1663 struct sockaddr_in6 *srv_addr6 =
1664 (struct sockaddr_in6 *)&server->dstaddr;
1665
4515148e 1666 if (!ipv6_addr_equal(&addr6->sin6_addr,
a9f1b85e 1667 &srv_addr6->sin6_addr))
4515148e 1668 return false;
a9f1b85e 1669 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
4515148e 1670 return false;
4515148e
JL
1671 break;
1672 }
a9f1b85e
PS
1673 default:
1674 WARN_ON(1);
1675 return false; /* don't expect to be here */
1676 }
4515148e 1677
3eb9a889
BG
1678 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
1679 return false;
1680
4515148e
JL
1681 return true;
1682}
1683
daf5b0b6
JL
1684static bool
1685match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
1686{
1687 unsigned int secFlags;
1688
1689 if (vol->secFlg & (~(CIFSSEC_MUST_SIGN | CIFSSEC_MUST_SEAL)))
1690 secFlags = vol->secFlg;
1691 else
1692 secFlags = global_secflags | vol->secFlg;
1693
1694 switch (server->secType) {
1695 case LANMAN:
1696 if (!(secFlags & (CIFSSEC_MAY_LANMAN|CIFSSEC_MAY_PLNTXT)))
1697 return false;
1698 break;
1699 case NTLMv2:
1700 if (!(secFlags & CIFSSEC_MAY_NTLMV2))
1701 return false;
1702 break;
1703 case NTLM:
1704 if (!(secFlags & CIFSSEC_MAY_NTLM))
1705 return false;
1706 break;
1707 case Kerberos:
1708 if (!(secFlags & CIFSSEC_MAY_KRB5))
1709 return false;
1710 break;
1711 case RawNTLMSSP:
1712 if (!(secFlags & CIFSSEC_MAY_NTLMSSP))
1713 return false;
1714 break;
1715 default:
1716 /* shouldn't happen */
1717 return false;
1718 }
1719
25985edc 1720 /* now check if signing mode is acceptable */
daf5b0b6 1721 if ((secFlags & CIFSSEC_MAY_SIGN) == 0 &&
96daf2b0 1722 (server->sec_mode & SECMODE_SIGN_REQUIRED))
daf5b0b6
JL
1723 return false;
1724 else if (((secFlags & CIFSSEC_MUST_SIGN) == CIFSSEC_MUST_SIGN) &&
96daf2b0 1725 (server->sec_mode &
daf5b0b6
JL
1726 (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED)) == 0)
1727 return false;
1728
1729 return true;
1730}
1731
37bb04e5
PS
1732static int match_server(struct TCP_Server_Info *server, struct sockaddr *addr,
1733 struct smb_vol *vol)
1734{
1735 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
1736 return 0;
1737
1738 if (!match_address(server, addr,
1739 (struct sockaddr *)&vol->srcaddr))
1740 return 0;
1741
1742 if (!match_port(server, addr))
1743 return 0;
1744
1745 if (!match_security(server, vol))
1746 return 0;
1747
1748 return 1;
1749}
1750
e7ddee90 1751static struct TCP_Server_Info *
daf5b0b6 1752cifs_find_tcp_session(struct sockaddr *addr, struct smb_vol *vol)
1da177e4 1753{
e7ddee90 1754 struct TCP_Server_Info *server;
e7ddee90 1755
3f9bcca7 1756 spin_lock(&cifs_tcp_ses_lock);
4515148e 1757 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
37bb04e5 1758 if (!match_server(server, addr, vol))
daf5b0b6
JL
1759 continue;
1760
e7ddee90 1761 ++server->srv_count;
3f9bcca7 1762 spin_unlock(&cifs_tcp_ses_lock);
b6b38f70 1763 cFYI(1, "Existing tcp session with server found");
e7ddee90 1764 return server;
1da177e4 1765 }
3f9bcca7 1766 spin_unlock(&cifs_tcp_ses_lock);
1da177e4
LT
1767 return NULL;
1768}
1b20d672 1769
14fbf50d 1770static void
e7ddee90 1771cifs_put_tcp_session(struct TCP_Server_Info *server)
1da177e4 1772{
e7ddee90 1773 struct task_struct *task;
1b20d672 1774
3f9bcca7 1775 spin_lock(&cifs_tcp_ses_lock);
e7ddee90 1776 if (--server->srv_count > 0) {
3f9bcca7 1777 spin_unlock(&cifs_tcp_ses_lock);
e7ddee90 1778 return;
1da177e4 1779 }
1b20d672 1780
f1d0c998
RL
1781 put_net(cifs_net_ns(server));
1782
e7ddee90 1783 list_del_init(&server->tcp_ses_list);
3f9bcca7 1784 spin_unlock(&cifs_tcp_ses_lock);
dea570e0 1785
c74093b6
JL
1786 cancel_delayed_work_sync(&server->echo);
1787
e7ddee90
JL
1788 spin_lock(&GlobalMid_Lock);
1789 server->tcpStatus = CifsExiting;
1790 spin_unlock(&GlobalMid_Lock);
dea570e0 1791
d2b91521 1792 cifs_crypto_shash_release(server);
488f1d2d
SJ
1793 cifs_fscache_release_client_cookie(server);
1794
21e73393
SP
1795 kfree(server->session_key.response);
1796 server->session_key.response = NULL;
1797 server->session_key.len = 0;
1798
e7ddee90
JL
1799 task = xchg(&server->tsk, NULL);
1800 if (task)
1801 force_sig(SIGKILL, task);
1da177e4
LT
1802}
1803
63c038c2
JL
1804static struct TCP_Server_Info *
1805cifs_get_tcp_session(struct smb_vol *volume_info)
1806{
1807 struct TCP_Server_Info *tcp_ses = NULL;
a9ac49d3 1808 struct sockaddr_storage addr;
63c038c2
JL
1809 struct sockaddr_in *sin_server = (struct sockaddr_in *) &addr;
1810 struct sockaddr_in6 *sin_server6 = (struct sockaddr_in6 *) &addr;
1811 int rc;
1812
a9ac49d3 1813 memset(&addr, 0, sizeof(struct sockaddr_storage));
63c038c2 1814
b6b38f70 1815 cFYI(1, "UNC: %s ip: %s", volume_info->UNC, volume_info->UNCip);
63c038c2 1816
1e68b2b2 1817 if (volume_info->UNCip && volume_info->UNC) {
50d97160
JL
1818 rc = cifs_fill_sockaddr((struct sockaddr *)&addr,
1819 volume_info->UNCip,
67b7626a 1820 strlen(volume_info->UNCip),
50d97160 1821 volume_info->port);
1e68b2b2 1822 if (!rc) {
63c038c2
JL
1823 /* we failed translating address */
1824 rc = -EINVAL;
1825 goto out_err;
1826 }
63c038c2
JL
1827 } else if (volume_info->UNCip) {
1828 /* BB using ip addr as tcp_ses name to connect to the
1829 DFS root below */
b6b38f70 1830 cERROR(1, "Connecting to DFS root not implemented yet");
63c038c2
JL
1831 rc = -EINVAL;
1832 goto out_err;
1833 } else /* which tcp_sess DFS root would we conect to */ {
b6b38f70
JP
1834 cERROR(1, "CIFS mount error: No UNC path (e.g. -o "
1835 "unc=//192.168.1.100/public) specified");
63c038c2
JL
1836 rc = -EINVAL;
1837 goto out_err;
1838 }
1839
1840 /* see if we already have a matching tcp_ses */
daf5b0b6 1841 tcp_ses = cifs_find_tcp_session((struct sockaddr *)&addr, volume_info);
63c038c2
JL
1842 if (tcp_ses)
1843 return tcp_ses;
1844
1845 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
1846 if (!tcp_ses) {
1847 rc = -ENOMEM;
1848 goto out_err;
1849 }
1850
d2b91521
SP
1851 rc = cifs_crypto_shash_allocate(tcp_ses);
1852 if (rc) {
1853 cERROR(1, "could not setup hash structures rc %d", rc);
1854 goto out_err;
1855 }
1856
f1d0c998 1857 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
63c038c2
JL
1858 tcp_ses->hostname = extract_hostname(volume_info->UNC);
1859 if (IS_ERR(tcp_ses->hostname)) {
1860 rc = PTR_ERR(tcp_ses->hostname);
f7c5445a 1861 goto out_err_crypto_release;
63c038c2
JL
1862 }
1863
1864 tcp_ses->noblocksnd = volume_info->noblocksnd;
1865 tcp_ses->noautotune = volume_info->noautotune;
6a5fa236 1866 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
63c038c2
JL
1867 atomic_set(&tcp_ses->inFlight, 0);
1868 init_waitqueue_head(&tcp_ses->response_q);
1869 init_waitqueue_head(&tcp_ses->request_q);
1870 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
1871 mutex_init(&tcp_ses->srv_mutex);
1872 memcpy(tcp_ses->workstation_RFC1001_name,
1873 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1874 memcpy(tcp_ses->server_RFC1001_name,
1875 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
5d0d2882 1876 tcp_ses->session_estab = false;
63c038c2 1877 tcp_ses->sequence_number = 0;
fda35943 1878 tcp_ses->lstrp = jiffies;
63c038c2
JL
1879 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
1880 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
c74093b6 1881 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
63c038c2
JL
1882
1883 /*
1884 * at this point we are the only ones with the pointer
1885 * to the struct since the kernel thread not created yet
1886 * no need to spinlock this init of tcpStatus or srv_count
1887 */
1888 tcp_ses->tcpStatus = CifsNew;
3eb9a889
BG
1889 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
1890 sizeof(tcp_ses->srcaddr));
63c038c2
JL
1891 ++tcp_ses->srv_count;
1892
a9ac49d3 1893 if (addr.ss_family == AF_INET6) {
b6b38f70 1894 cFYI(1, "attempting ipv6 connect");
63c038c2
JL
1895 /* BB should we allow ipv6 on port 139? */
1896 /* other OS never observed in Wild doing 139 with v6 */
a9f1b85e
PS
1897 memcpy(&tcp_ses->dstaddr, sin_server6,
1898 sizeof(struct sockaddr_in6));
1899 } else
1900 memcpy(&tcp_ses->dstaddr, sin_server,
1901 sizeof(struct sockaddr_in));
1902
1903 rc = ip_connect(tcp_ses);
63c038c2 1904 if (rc < 0) {
b6b38f70 1905 cERROR(1, "Error connecting to socket. Aborting operation");
f7c5445a 1906 goto out_err_crypto_release;
63c038c2
JL
1907 }
1908
1909 /*
1910 * since we're in a cifs function already, we know that
1911 * this will succeed. No need for try_module_get().
1912 */
1913 __module_get(THIS_MODULE);
7c97c200 1914 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
63c038c2
JL
1915 tcp_ses, "cifsd");
1916 if (IS_ERR(tcp_ses->tsk)) {
1917 rc = PTR_ERR(tcp_ses->tsk);
b6b38f70 1918 cERROR(1, "error %d create cifsd thread", rc);
63c038c2 1919 module_put(THIS_MODULE);
f7c5445a 1920 goto out_err_crypto_release;
63c038c2 1921 }
fd88ce93 1922 tcp_ses->tcpStatus = CifsNeedNegotiate;
63c038c2
JL
1923
1924 /* thread spawned, put it on the list */
3f9bcca7 1925 spin_lock(&cifs_tcp_ses_lock);
63c038c2 1926 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
3f9bcca7 1927 spin_unlock(&cifs_tcp_ses_lock);
63c038c2 1928
488f1d2d
SJ
1929 cifs_fscache_get_client_cookie(tcp_ses);
1930
c74093b6
JL
1931 /* queue echo request delayed work */
1932 queue_delayed_work(system_nrt_wq, &tcp_ses->echo, SMB_ECHO_INTERVAL);
1933
63c038c2
JL
1934 return tcp_ses;
1935
f7c5445a 1936out_err_crypto_release:
d2b91521
SP
1937 cifs_crypto_shash_release(tcp_ses);
1938
f1d0c998
RL
1939 put_net(cifs_net_ns(tcp_ses));
1940
63c038c2
JL
1941out_err:
1942 if (tcp_ses) {
8347a5cd
SF
1943 if (!IS_ERR(tcp_ses->hostname))
1944 kfree(tcp_ses->hostname);
63c038c2
JL
1945 if (tcp_ses->ssocket)
1946 sock_release(tcp_ses->ssocket);
1947 kfree(tcp_ses);
1948 }
1949 return ERR_PTR(rc);
1950}
1951
96daf2b0 1952static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
37bb04e5
PS
1953{
1954 switch (ses->server->secType) {
1955 case Kerberos:
1956 if (vol->cred_uid != ses->cred_uid)
1957 return 0;
1958 break;
1959 default:
1960 /* anything else takes username/password */
1961 if (ses->user_name == NULL)
1962 return 0;
1963 if (strncmp(ses->user_name, vol->username,
1964 MAX_USERNAME_SIZE))
1965 return 0;
1966 if (strlen(vol->username) != 0 &&
1967 ses->password != NULL &&
1968 strncmp(ses->password,
1969 vol->password ? vol->password : "",
1970 MAX_PASSWORD_SIZE))
1971 return 0;
1972 }
1973 return 1;
1974}
1975
96daf2b0 1976static struct cifs_ses *
4ff67b72 1977cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
1da177e4 1978{
96daf2b0 1979 struct cifs_ses *ses;
dea570e0 1980
3f9bcca7 1981 spin_lock(&cifs_tcp_ses_lock);
4ff67b72 1982 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
37bb04e5
PS
1983 if (!match_session(ses, vol))
1984 continue;
14fbf50d 1985 ++ses->ses_count;
3f9bcca7 1986 spin_unlock(&cifs_tcp_ses_lock);
14fbf50d
JL
1987 return ses;
1988 }
3f9bcca7 1989 spin_unlock(&cifs_tcp_ses_lock);
14fbf50d
JL
1990 return NULL;
1991}
dea570e0 1992
14fbf50d 1993static void
96daf2b0 1994cifs_put_smb_ses(struct cifs_ses *ses)
14fbf50d
JL
1995{
1996 int xid;
1997 struct TCP_Server_Info *server = ses->server;
dea570e0 1998
36988c76 1999 cFYI(1, "%s: ses_count=%d\n", __func__, ses->ses_count);
3f9bcca7 2000 spin_lock(&cifs_tcp_ses_lock);
14fbf50d 2001 if (--ses->ses_count > 0) {
3f9bcca7 2002 spin_unlock(&cifs_tcp_ses_lock);
14fbf50d
JL
2003 return;
2004 }
dea570e0 2005
14fbf50d 2006 list_del_init(&ses->smb_ses_list);
3f9bcca7 2007 spin_unlock(&cifs_tcp_ses_lock);
dea570e0 2008
14fbf50d
JL
2009 if (ses->status == CifsGood) {
2010 xid = GetXid();
2011 CIFSSMBLogoff(xid, ses);
2012 _FreeXid(xid);
2013 }
2014 sesInfoFree(ses);
2015 cifs_put_tcp_session(server);
2016}
dea570e0 2017
d9b94201
SF
2018static bool warned_on_ntlm; /* globals init to false automatically */
2019
96daf2b0 2020static struct cifs_ses *
36988c76
JL
2021cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
2022{
2023 int rc = -ENOMEM, xid;
96daf2b0 2024 struct cifs_ses *ses;
a9f1b85e
PS
2025 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2026 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
36988c76
JL
2027
2028 xid = GetXid();
2029
4ff67b72 2030 ses = cifs_find_smb_ses(server, volume_info);
36988c76
JL
2031 if (ses) {
2032 cFYI(1, "Existing smb sess found (status=%d)", ses->status);
2033
36988c76 2034 mutex_lock(&ses->session_mutex);
198b5682
JL
2035 rc = cifs_negotiate_protocol(xid, ses);
2036 if (rc) {
2037 mutex_unlock(&ses->session_mutex);
2038 /* problem -- put our ses reference */
2039 cifs_put_smb_ses(ses);
2040 FreeXid(xid);
2041 return ERR_PTR(rc);
2042 }
36988c76
JL
2043 if (ses->need_reconnect) {
2044 cFYI(1, "Session needs reconnect");
2045 rc = cifs_setup_session(xid, ses,
2046 volume_info->local_nls);
2047 if (rc) {
2048 mutex_unlock(&ses->session_mutex);
2049 /* problem -- put our reference */
2050 cifs_put_smb_ses(ses);
2051 FreeXid(xid);
2052 return ERR_PTR(rc);
2053 }
2054 }
2055 mutex_unlock(&ses->session_mutex);
460cf341
JL
2056
2057 /* existing SMB ses has a server reference already */
2058 cifs_put_tcp_session(server);
36988c76
JL
2059 FreeXid(xid);
2060 return ses;
2061 }
2062
2063 cFYI(1, "Existing smb sess not found");
2064 ses = sesInfoAlloc();
2065 if (ses == NULL)
2066 goto get_ses_fail;
2067
2068 /* new SMB session uses our server ref */
2069 ses->server = server;
a9f1b85e
PS
2070 if (server->dstaddr.ss_family == AF_INET6)
2071 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
36988c76 2072 else
a9f1b85e 2073 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
36988c76 2074
8727c8a8
SF
2075 if (volume_info->username) {
2076 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
2077 if (!ses->user_name)
2078 goto get_ses_fail;
2079 }
36988c76
JL
2080
2081 /* volume_info->password freed at unmount */
2082 if (volume_info->password) {
2083 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
2084 if (!ses->password)
2085 goto get_ses_fail;
2086 }
2087 if (volume_info->domainname) {
d3686d54
SP
2088 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
2089 if (!ses->domainName)
2090 goto get_ses_fail;
36988c76 2091 }
3e4b3e1f 2092 ses->cred_uid = volume_info->cred_uid;
36988c76 2093 ses->linux_uid = volume_info->linux_uid;
d9b94201
SF
2094
2095 /* ntlmv2 is much stronger than ntlm security, and has been broadly
2096 supported for many years, time to update default security mechanism */
2097 if ((volume_info->secFlg == 0) && warned_on_ntlm == false) {
2098 warned_on_ntlm = true;
2099 cERROR(1, "default security mechanism requested. The default "
2100 "security mechanism will be upgraded from ntlm to "
9d1e397b 2101 "ntlmv2 in kernel release 3.2");
d9b94201 2102 }
36988c76
JL
2103 ses->overrideSecFlg = volume_info->secFlg;
2104
2105 mutex_lock(&ses->session_mutex);
198b5682
JL
2106 rc = cifs_negotiate_protocol(xid, ses);
2107 if (!rc)
2108 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
36988c76 2109 mutex_unlock(&ses->session_mutex);
c8e56f1f 2110 if (rc)
36988c76
JL
2111 goto get_ses_fail;
2112
2113 /* success, put it on the list */
3f9bcca7 2114 spin_lock(&cifs_tcp_ses_lock);
36988c76 2115 list_add(&ses->smb_ses_list, &server->smb_ses_list);
3f9bcca7 2116 spin_unlock(&cifs_tcp_ses_lock);
36988c76
JL
2117
2118 FreeXid(xid);
2119 return ses;
2120
2121get_ses_fail:
2122 sesInfoFree(ses);
2123 FreeXid(xid);
2124 return ERR_PTR(rc);
2125}
2126
96daf2b0 2127static int match_tcon(struct cifs_tcon *tcon, const char *unc)
37bb04e5
PS
2128{
2129 if (tcon->tidStatus == CifsExiting)
2130 return 0;
2131 if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
2132 return 0;
2133 return 1;
2134}
2135
96daf2b0
SF
2136static struct cifs_tcon *
2137cifs_find_tcon(struct cifs_ses *ses, const char *unc)
f1987b44
JL
2138{
2139 struct list_head *tmp;
96daf2b0 2140 struct cifs_tcon *tcon;
f1987b44 2141
3f9bcca7 2142 spin_lock(&cifs_tcp_ses_lock);
f1987b44 2143 list_for_each(tmp, &ses->tcon_list) {
96daf2b0 2144 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
37bb04e5 2145 if (!match_tcon(tcon, unc))
f1987b44 2146 continue;
f1987b44 2147 ++tcon->tc_count;
3f9bcca7 2148 spin_unlock(&cifs_tcp_ses_lock);
dea570e0 2149 return tcon;
1da177e4 2150 }
3f9bcca7 2151 spin_unlock(&cifs_tcp_ses_lock);
1da177e4
LT
2152 return NULL;
2153}
2154
f1987b44 2155static void
96daf2b0 2156cifs_put_tcon(struct cifs_tcon *tcon)
f1987b44
JL
2157{
2158 int xid;
96daf2b0 2159 struct cifs_ses *ses = tcon->ses;
f1987b44 2160
d00c28de 2161 cFYI(1, "%s: tc_count=%d\n", __func__, tcon->tc_count);
3f9bcca7 2162 spin_lock(&cifs_tcp_ses_lock);
f1987b44 2163 if (--tcon->tc_count > 0) {
3f9bcca7 2164 spin_unlock(&cifs_tcp_ses_lock);
f1987b44
JL
2165 return;
2166 }
2167
2168 list_del_init(&tcon->tcon_list);
3f9bcca7 2169 spin_unlock(&cifs_tcp_ses_lock);
f1987b44
JL
2170
2171 xid = GetXid();
2172 CIFSSMBTDis(xid, tcon);
2173 _FreeXid(xid);
2174
d03382ce 2175 cifs_fscache_release_super_cookie(tcon);
9f841593 2176 tconInfoFree(tcon);
f1987b44
JL
2177 cifs_put_smb_ses(ses);
2178}
2179
96daf2b0
SF
2180static struct cifs_tcon *
2181cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
d00c28de
JL
2182{
2183 int rc, xid;
96daf2b0 2184 struct cifs_tcon *tcon;
d00c28de
JL
2185
2186 tcon = cifs_find_tcon(ses, volume_info->UNC);
2187 if (tcon) {
2188 cFYI(1, "Found match on UNC path");
2189 /* existing tcon already has a reference */
2190 cifs_put_smb_ses(ses);
2191 if (tcon->seal != volume_info->seal)
2192 cERROR(1, "transport encryption setting "
2193 "conflicts with existing tid");
2194 return tcon;
2195 }
2196
2197 tcon = tconInfoAlloc();
2198 if (tcon == NULL) {
2199 rc = -ENOMEM;
2200 goto out_fail;
2201 }
2202
2203 tcon->ses = ses;
2204 if (volume_info->password) {
2205 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
2206 if (!tcon->password) {
2207 rc = -ENOMEM;
2208 goto out_fail;
2209 }
2210 }
2211
2212 if (strchr(volume_info->UNC + 3, '\\') == NULL
2213 && strchr(volume_info->UNC + 3, '/') == NULL) {
2214 cERROR(1, "Missing share name");
2215 rc = -ENODEV;
2216 goto out_fail;
2217 }
2218
2219 /* BB Do we need to wrap session_mutex around
2220 * this TCon call and Unix SetFS as
2221 * we do on SessSetup and reconnect? */
2222 xid = GetXid();
2223 rc = CIFSTCon(xid, ses, volume_info->UNC, tcon, volume_info->local_nls);
2224 FreeXid(xid);
2225 cFYI(1, "CIFS Tcon rc = %d", rc);
2226 if (rc)
2227 goto out_fail;
2228
2229 if (volume_info->nodfs) {
2230 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
2231 cFYI(1, "DFS disabled (%d)", tcon->Flags);
2232 }
2233 tcon->seal = volume_info->seal;
2234 /* we can have only one retry value for a connection
2235 to a share so for resources mounted more than once
2236 to the same server share the last value passed in
2237 for the retry flag is used */
2238 tcon->retry = volume_info->retry;
2239 tcon->nocase = volume_info->nocase;
2240 tcon->local_lease = volume_info->local_lease;
2241
3f9bcca7 2242 spin_lock(&cifs_tcp_ses_lock);
d00c28de 2243 list_add(&tcon->tcon_list, &ses->tcon_list);
3f9bcca7 2244 spin_unlock(&cifs_tcp_ses_lock);
d00c28de 2245
d03382ce
SJ
2246 cifs_fscache_get_super_cookie(tcon);
2247
d00c28de
JL
2248 return tcon;
2249
2250out_fail:
2251 tconInfoFree(tcon);
2252 return ERR_PTR(rc);
2253}
2254
9d002df4
JL
2255void
2256cifs_put_tlink(struct tcon_link *tlink)
2257{
2258 if (!tlink || IS_ERR(tlink))
2259 return;
2260
2261 if (!atomic_dec_and_test(&tlink->tl_count) ||
2262 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2263 tlink->tl_time = jiffies;
2264 return;
2265 }
2266
2267 if (!IS_ERR(tlink_tcon(tlink)))
2268 cifs_put_tcon(tlink_tcon(tlink));
2269 kfree(tlink);
2270 return;
2271}
d00c28de 2272
25c7f41e 2273static inline struct tcon_link *
cd51875d
PS
2274cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb)
2275{
2276 return cifs_sb->master_tlink;
2277}
25c7f41e
PS
2278
2279static int
2280compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2281{
2282 struct cifs_sb_info *old = CIFS_SB(sb);
2283 struct cifs_sb_info *new = mnt_data->cifs_sb;
2284
2285 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2286 return 0;
2287
2288 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
2289 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
2290 return 0;
2291
2292 if (old->rsize != new->rsize)
2293 return 0;
2294
2295 /*
2296 * We want to share sb only if we don't specify wsize or specified wsize
2297 * is greater or equal than existing one.
2298 */
2299 if (new->wsize && new->wsize < old->wsize)
2300 return 0;
2301
2302 if (old->mnt_uid != new->mnt_uid || old->mnt_gid != new->mnt_gid)
2303 return 0;
2304
2305 if (old->mnt_file_mode != new->mnt_file_mode ||
2306 old->mnt_dir_mode != new->mnt_dir_mode)
2307 return 0;
2308
2309 if (strcmp(old->local_nls->charset, new->local_nls->charset))
2310 return 0;
2311
2312 if (old->actimeo != new->actimeo)
2313 return 0;
2314
2315 return 1;
2316}
2317
2318int
2319cifs_match_super(struct super_block *sb, void *data)
2320{
2321 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2322 struct smb_vol *volume_info;
2323 struct cifs_sb_info *cifs_sb;
2324 struct TCP_Server_Info *tcp_srv;
96daf2b0
SF
2325 struct cifs_ses *ses;
2326 struct cifs_tcon *tcon;
25c7f41e
PS
2327 struct tcon_link *tlink;
2328 struct sockaddr_storage addr;
2329 int rc = 0;
2330
2331 memset(&addr, 0, sizeof(struct sockaddr_storage));
2332
2333 spin_lock(&cifs_tcp_ses_lock);
2334 cifs_sb = CIFS_SB(sb);
2335 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2336 if (IS_ERR(tlink)) {
2337 spin_unlock(&cifs_tcp_ses_lock);
2338 return rc;
2339 }
2340 tcon = tlink_tcon(tlink);
2341 ses = tcon->ses;
2342 tcp_srv = ses->server;
2343
2344 volume_info = mnt_data->vol;
2345
2346 if (!volume_info->UNCip || !volume_info->UNC)
2347 goto out;
2348
2349 rc = cifs_fill_sockaddr((struct sockaddr *)&addr,
2350 volume_info->UNCip,
2351 strlen(volume_info->UNCip),
2352 volume_info->port);
2353 if (!rc)
2354 goto out;
2355
2356 if (!match_server(tcp_srv, (struct sockaddr *)&addr, volume_info) ||
2357 !match_session(ses, volume_info) ||
2358 !match_tcon(tcon, volume_info->UNC)) {
2359 rc = 0;
2360 goto out;
2361 }
2362
2363 rc = compare_mount_options(sb, mnt_data);
2364out:
25c7f41e 2365 spin_unlock(&cifs_tcp_ses_lock);
f484b5d0 2366 cifs_put_tlink(tlink);
25c7f41e
PS
2367 return rc;
2368}
2369
1da177e4 2370int
96daf2b0 2371get_dfs_path(int xid, struct cifs_ses *pSesInfo, const char *old_path,
50c2f753 2372 const struct nls_table *nls_codepage, unsigned int *pnum_referrals,
366781c1 2373 struct dfs_info3_param **preferrals, int remap)
1da177e4
LT
2374{
2375 char *temp_unc;
2376 int rc = 0;
2377
2378 *pnum_referrals = 0;
366781c1 2379 *preferrals = NULL;
1da177e4
LT
2380
2381 if (pSesInfo->ipc_tid == 0) {
2382 temp_unc = kmalloc(2 /* for slashes */ +
50c2f753
SF
2383 strnlen(pSesInfo->serverName,
2384 SERVER_NAME_LEN_WITH_NULL * 2)
1da177e4
LT
2385 + 1 + 4 /* slash IPC$ */ + 2,
2386 GFP_KERNEL);
2387 if (temp_unc == NULL)
2388 return -ENOMEM;
2389 temp_unc[0] = '\\';
2390 temp_unc[1] = '\\';
2391 strcpy(temp_unc + 2, pSesInfo->serverName);
2392 strcpy(temp_unc + 2 + strlen(pSesInfo->serverName), "\\IPC$");
2393 rc = CIFSTCon(xid, pSesInfo, temp_unc, NULL, nls_codepage);
b6b38f70 2394 cFYI(1, "CIFS Tcon rc = %d ipc_tid = %d", rc, pSesInfo->ipc_tid);
1da177e4
LT
2395 kfree(temp_unc);
2396 }
2397 if (rc == 0)
c2cf07d5 2398 rc = CIFSGetDFSRefer(xid, pSesInfo, old_path, preferrals,
737b758c 2399 pnum_referrals, nls_codepage, remap);
366781c1
SF
2400 /* BB map targetUNCs to dfs_info3 structures, here or
2401 in CIFSGetDFSRefer BB */
1da177e4
LT
2402
2403 return rc;
2404}
2405
09e50d55
JL
2406#ifdef CONFIG_DEBUG_LOCK_ALLOC
2407static struct lock_class_key cifs_key[2];
2408static struct lock_class_key cifs_slock_key[2];
2409
2410static inline void
2411cifs_reclassify_socket4(struct socket *sock)
2412{
2413 struct sock *sk = sock->sk;
2414 BUG_ON(sock_owned_by_user(sk));
2415 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2416 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2417}
2418
2419static inline void
2420cifs_reclassify_socket6(struct socket *sock)
2421{
2422 struct sock *sk = sock->sk;
2423 BUG_ON(sock_owned_by_user(sk));
2424 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2425 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2426}
2427#else
2428static inline void
2429cifs_reclassify_socket4(struct socket *sock)
2430{
2431}
2432
2433static inline void
2434cifs_reclassify_socket6(struct socket *sock)
2435{
2436}
2437#endif
2438
1da177e4 2439/* See RFC1001 section 14 on representation of Netbios names */
50c2f753 2440static void rfc1002mangle(char *target, char *source, unsigned int length)
1da177e4 2441{
50c2f753 2442 unsigned int i, j;
1da177e4 2443
50c2f753 2444 for (i = 0, j = 0; i < (length); i++) {
1da177e4
LT
2445 /* mask a nibble at a time and encode */
2446 target[j] = 'A' + (0x0F & (source[i] >> 4));
2447 target[j+1] = 'A' + (0x0F & source[i]);
50c2f753 2448 j += 2;
1da177e4
LT
2449 }
2450
2451}
2452
3eb9a889
BG
2453static int
2454bind_socket(struct TCP_Server_Info *server)
2455{
2456 int rc = 0;
2457 if (server->srcaddr.ss_family != AF_UNSPEC) {
2458 /* Bind to the specified local IP address */
2459 struct socket *socket = server->ssocket;
2460 rc = socket->ops->bind(socket,
2461 (struct sockaddr *) &server->srcaddr,
2462 sizeof(server->srcaddr));
2463 if (rc < 0) {
2464 struct sockaddr_in *saddr4;
2465 struct sockaddr_in6 *saddr6;
2466 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2467 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2468 if (saddr6->sin6_family == AF_INET6)
2469 cERROR(1, "cifs: "
2470 "Failed to bind to: %pI6c, error: %d\n",
2471 &saddr6->sin6_addr, rc);
2472 else
2473 cERROR(1, "cifs: "
2474 "Failed to bind to: %pI4, error: %d\n",
2475 &saddr4->sin_addr.s_addr, rc);
2476 }
2477 }
2478 return rc;
2479}
1da177e4
LT
2480
2481static int
a9f1b85e 2482ip_rfc1001_connect(struct TCP_Server_Info *server)
1da177e4
LT
2483{
2484 int rc = 0;
a9f1b85e
PS
2485 /*
2486 * some servers require RFC1001 sessinit before sending
2487 * negprot - BB check reconnection in case where second
2488 * sessinit is sent but no second negprot
2489 */
2490 struct rfc1002_session_packet *ses_init_buf;
2491 struct smb_hdr *smb_buf;
2492 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2493 GFP_KERNEL);
2494 if (ses_init_buf) {
2495 ses_init_buf->trailer.session_req.called_len = 32;
2496
2497 if (server->server_RFC1001_name &&
2498 server->server_RFC1001_name[0] != 0)
2499 rfc1002mangle(ses_init_buf->trailer.
2500 session_req.called_name,
2501 server->server_RFC1001_name,
2502 RFC1001_NAME_LEN_WITH_NULL);
2503 else
2504 rfc1002mangle(ses_init_buf->trailer.
2505 session_req.called_name,
2506 DEFAULT_CIFS_CALLED_NAME,
2507 RFC1001_NAME_LEN_WITH_NULL);
2508
2509 ses_init_buf->trailer.session_req.calling_len = 32;
2510
2511 /*
2512 * calling name ends in null (byte 16) from old smb
2513 * convention.
2514 */
2515 if (server->workstation_RFC1001_name &&
2516 server->workstation_RFC1001_name[0] != 0)
2517 rfc1002mangle(ses_init_buf->trailer.
2518 session_req.calling_name,
2519 server->workstation_RFC1001_name,
2520 RFC1001_NAME_LEN_WITH_NULL);
2521 else
2522 rfc1002mangle(ses_init_buf->trailer.
2523 session_req.calling_name,
2524 "LINUX_CIFS_CLNT",
2525 RFC1001_NAME_LEN_WITH_NULL);
2526
2527 ses_init_buf->trailer.session_req.scope1 = 0;
2528 ses_init_buf->trailer.session_req.scope2 = 0;
2529 smb_buf = (struct smb_hdr *)ses_init_buf;
2530
2531 /* sizeof RFC1002_SESSION_REQUEST with no scope */
be8e3b00 2532 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
a9f1b85e
PS
2533 rc = smb_send(server, smb_buf, 0x44);
2534 kfree(ses_init_buf);
2535 /*
2536 * RFC1001 layer in at least one server
2537 * requires very short break before negprot
2538 * presumably because not expecting negprot
2539 * to follow so fast. This is a simple
2540 * solution that works without
2541 * complicating the code and causes no
2542 * significant slowing down on mount
2543 * for everyone else
2544 */
2545 usleep_range(1000, 2000);
2546 }
2547 /*
2548 * else the negprot may still work without this
2549 * even though malloc failed
2550 */
2551
2552 return rc;
2553}
2554
2555static int
2556generic_ip_connect(struct TCP_Server_Info *server)
2557{
2558 int rc = 0;
6da97910 2559 __be16 sport;
a9f1b85e 2560 int slen, sfamily;
bcf4b106 2561 struct socket *socket = server->ssocket;
a9f1b85e
PS
2562 struct sockaddr *saddr;
2563
2564 saddr = (struct sockaddr *) &server->dstaddr;
2565
2566 if (server->dstaddr.ss_family == AF_INET6) {
2567 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
2568 slen = sizeof(struct sockaddr_in6);
2569 sfamily = AF_INET6;
2570 } else {
2571 sport = ((struct sockaddr_in *) saddr)->sin_port;
2572 slen = sizeof(struct sockaddr_in);
2573 sfamily = AF_INET;
2574 }
1da177e4 2575
bcf4b106 2576 if (socket == NULL) {
f1d0c998
RL
2577 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
2578 IPPROTO_TCP, &socket, 1);
1da177e4 2579 if (rc < 0) {
b6b38f70 2580 cERROR(1, "Error %d creating socket", rc);
a9f1b85e 2581 server->ssocket = NULL;
1da177e4 2582 return rc;
1da177e4 2583 }
bcf4b106
JL
2584
2585 /* BB other socket options to set KEEPALIVE, NODELAY? */
b6b38f70 2586 cFYI(1, "Socket created");
bcf4b106
JL
2587 server->ssocket = socket;
2588 socket->sk->sk_allocation = GFP_NOFS;
a9f1b85e
PS
2589 if (sfamily == AF_INET6)
2590 cifs_reclassify_socket6(socket);
2591 else
2592 cifs_reclassify_socket4(socket);
1da177e4
LT
2593 }
2594
3eb9a889
BG
2595 rc = bind_socket(server);
2596 if (rc < 0)
2597 return rc;
2598
bcf4b106
JL
2599 /*
2600 * Eventually check for other socket options to change from
a9f1b85e
PS
2601 * the default. sock_setsockopt not used because it expects
2602 * user space buffer
bcf4b106
JL
2603 */
2604 socket->sk->sk_rcvtimeo = 7 * HZ;
da505c38 2605 socket->sk->sk_sndtimeo = 5 * HZ;
edf1ae40 2606
b387eaeb 2607 /* make the bufsizes depend on wsize/rsize and max requests */
bcf4b106
JL
2608 if (server->noautotune) {
2609 if (socket->sk->sk_sndbuf < (200 * 1024))
2610 socket->sk->sk_sndbuf = 200 * 1024;
2611 if (socket->sk->sk_rcvbuf < (140 * 1024))
2612 socket->sk->sk_rcvbuf = 140 * 1024;
edf1ae40 2613 }
1da177e4 2614
6a5fa236 2615 if (server->tcp_nodelay) {
a9f1b85e 2616 int val = 1;
6a5fa236
SF
2617 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
2618 (char *)&val, sizeof(val));
2619 if (rc)
b6b38f70 2620 cFYI(1, "set TCP_NODELAY socket option error %d", rc);
6a5fa236
SF
2621 }
2622
b6b38f70 2623 cFYI(1, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx",
bcf4b106 2624 socket->sk->sk_sndbuf,
b6b38f70 2625 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
bcf4b106 2626
ee1b3ea9
JL
2627 rc = socket->ops->connect(socket, saddr, slen, 0);
2628 if (rc < 0) {
2629 cFYI(1, "Error %d connecting to server", rc);
2630 sock_release(socket);
2631 server->ssocket = NULL;
2632 return rc;
2633 }
2634
a9f1b85e
PS
2635 if (sport == htons(RFC1001_PORT))
2636 rc = ip_rfc1001_connect(server);
50c2f753 2637
1da177e4
LT
2638 return rc;
2639}
2640
2641static int
a9f1b85e 2642ip_connect(struct TCP_Server_Info *server)
1da177e4 2643{
6da97910 2644 __be16 *sport;
a9f1b85e
PS
2645 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2646 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
1da177e4 2647
a9f1b85e
PS
2648 if (server->dstaddr.ss_family == AF_INET6)
2649 sport = &addr6->sin6_port;
2650 else
2651 sport = &addr->sin_port;
1da177e4 2652
a9f1b85e
PS
2653 if (*sport == 0) {
2654 int rc;
1da177e4 2655
a9f1b85e
PS
2656 /* try with 445 port at first */
2657 *sport = htons(CIFS_PORT);
3eb9a889 2658
a9f1b85e 2659 rc = generic_ip_connect(server);
1da177e4 2660 if (rc >= 0)
a9f1b85e 2661 return rc;
6a5fa236 2662
a9f1b85e
PS
2663 /* if it failed, try with 139 port */
2664 *sport = htons(RFC1001_PORT);
6a5fa236
SF
2665 }
2666
a9f1b85e 2667 return generic_ip_connect(server);
1da177e4
LT
2668}
2669
96daf2b0 2670void reset_cifs_unix_caps(int xid, struct cifs_tcon *tcon,
2c6292ae 2671 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
8af18971
SF
2672{
2673 /* if we are reconnecting then should we check to see if
2674 * any requested capabilities changed locally e.g. via
2675 * remount but we can not do much about it here
2676 * if they have (even if we could detect it by the following)
2677 * Perhaps we could add a backpointer to array of sb from tcon
2678 * or if we change to make all sb to same share the same
2679 * sb as NFS - then we only have one backpointer to sb.
2680 * What if we wanted to mount the server share twice once with
2681 * and once without posixacls or posix paths? */
2682 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
50c2f753 2683
c18c842b
SF
2684 if (vol_info && vol_info->no_linux_ext) {
2685 tcon->fsUnixInfo.Capability = 0;
2686 tcon->unix_ext = 0; /* Unix Extensions disabled */
b6b38f70 2687 cFYI(1, "Linux protocol extensions disabled");
c18c842b
SF
2688 return;
2689 } else if (vol_info)
2690 tcon->unix_ext = 1; /* Unix Extensions supported */
2691
2692 if (tcon->unix_ext == 0) {
b6b38f70 2693 cFYI(1, "Unix extensions disabled so not set on reconnect");
c18c842b
SF
2694 return;
2695 }
50c2f753 2696
fb8c4b14 2697 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
8af18971 2698 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
6848b733 2699 cFYI(1, "unix caps which server supports %lld", cap);
8af18971
SF
2700 /* check for reconnect case in which we do not
2701 want to change the mount behavior if we can avoid it */
fb8c4b14 2702 if (vol_info == NULL) {
50c2f753 2703 /* turn off POSIX ACL and PATHNAMES if not set
8af18971
SF
2704 originally at mount time */
2705 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
2706 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
11b6d645
IM
2707 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2708 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
b6b38f70 2709 cERROR(1, "POSIXPATH support change");
8af18971 2710 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
11b6d645 2711 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
b6b38f70
JP
2712 cERROR(1, "possible reconnect error");
2713 cERROR(1, "server disabled POSIX path support");
11b6d645 2714 }
8af18971 2715 }
50c2f753 2716
6848b733
SF
2717 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2718 cERROR(1, "per-share encryption not supported yet");
2719
8af18971 2720 cap &= CIFS_UNIX_CAP_MASK;
75865f8c 2721 if (vol_info && vol_info->no_psx_acl)
8af18971 2722 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
75865f8c 2723 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
b6b38f70 2724 cFYI(1, "negotiated posix acl support");
2c6292ae
AV
2725 if (cifs_sb)
2726 cifs_sb->mnt_cifs_flags |=
2727 CIFS_MOUNT_POSIXACL;
8af18971
SF
2728 }
2729
75865f8c 2730 if (vol_info && vol_info->posix_paths == 0)
8af18971 2731 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
75865f8c 2732 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
b6b38f70 2733 cFYI(1, "negotiate posix pathnames");
2c6292ae
AV
2734 if (cifs_sb)
2735 cifs_sb->mnt_cifs_flags |=
8af18971
SF
2736 CIFS_MOUNT_POSIX_PATHS;
2737 }
50c2f753 2738
2c6292ae 2739 if (cifs_sb && (cifs_sb->rsize > 127 * 1024)) {
75865f8c 2740 if ((cap & CIFS_UNIX_LARGE_READ_CAP) == 0) {
2c6292ae 2741 cifs_sb->rsize = 127 * 1024;
b6b38f70 2742 cFYI(DBG2, "larger reads not supported by srv");
75865f8c
SF
2743 }
2744 }
50c2f753
SF
2745
2746
b6b38f70 2747 cFYI(1, "Negotiate caps 0x%x", (int)cap);
8af18971 2748#ifdef CONFIG_CIFS_DEBUG2
75865f8c 2749 if (cap & CIFS_UNIX_FCNTL_CAP)
b6b38f70 2750 cFYI(1, "FCNTL cap");
75865f8c 2751 if (cap & CIFS_UNIX_EXTATTR_CAP)
b6b38f70 2752 cFYI(1, "EXTATTR cap");
75865f8c 2753 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
b6b38f70 2754 cFYI(1, "POSIX path cap");
75865f8c 2755 if (cap & CIFS_UNIX_XATTR_CAP)
b6b38f70 2756 cFYI(1, "XATTR cap");
75865f8c 2757 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
b6b38f70 2758 cFYI(1, "POSIX ACL cap");
75865f8c 2759 if (cap & CIFS_UNIX_LARGE_READ_CAP)
b6b38f70 2760 cFYI(1, "very large read cap");
75865f8c 2761 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
b6b38f70 2762 cFYI(1, "very large write cap");
6848b733
SF
2763 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
2764 cFYI(1, "transport encryption cap");
2765 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2766 cFYI(1, "mandatory transport encryption cap");
8af18971
SF
2767#endif /* CIFS_DEBUG2 */
2768 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
442aa310 2769 if (vol_info == NULL) {
b6b38f70 2770 cFYI(1, "resetting capabilities failed");
442aa310 2771 } else
b6b38f70 2772 cERROR(1, "Negotiating Unix capabilities "
5a44b319
SF
2773 "with the server failed. Consider "
2774 "mounting with the Unix Extensions\n"
2775 "disabled, if problems are found, "
2776 "by specifying the nounix mount "
b6b38f70 2777 "option.");
5a44b319 2778
8af18971
SF
2779 }
2780 }
2781}
2782
724d9f1c
PS
2783void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
2784 struct cifs_sb_info *cifs_sb)
b1c8d2b4 2785{
2de970ff
JL
2786 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
2787
2ced6f69
AV
2788 spin_lock_init(&cifs_sb->tlink_tree_lock);
2789 cifs_sb->tlink_tree = RB_ROOT;
2790
3b795210 2791 if (pvolume_info->rsize > CIFSMaxBufSize) {
b6b38f70
JP
2792 cERROR(1, "rsize %d too large, using MaxBufSize",
2793 pvolume_info->rsize);
3b795210
SF
2794 cifs_sb->rsize = CIFSMaxBufSize;
2795 } else if ((pvolume_info->rsize) &&
2796 (pvolume_info->rsize <= CIFSMaxBufSize))
2797 cifs_sb->rsize = pvolume_info->rsize;
2798 else /* default */
2799 cifs_sb->rsize = CIFSMaxBufSize;
2800
3b795210
SF
2801 if (cifs_sb->rsize < 2048) {
2802 cifs_sb->rsize = 2048;
2803 /* Windows ME may prefer this */
b6b38f70 2804 cFYI(1, "readsize set to minimum: 2048");
3b795210 2805 }
25c7f41e
PS
2806
2807 /*
2808 * Temporarily set wsize for matching superblock. If we end up using
2809 * new sb then cifs_negotiate_wsize will later negotiate it downward
2810 * if needed.
2811 */
2812 cifs_sb->wsize = pvolume_info->wsize;
2813
3b795210
SF
2814 cifs_sb->mnt_uid = pvolume_info->linux_uid;
2815 cifs_sb->mnt_gid = pvolume_info->linux_gid;
3d3ea8e6
SP
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;
3b795210
SF
2820 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
2821 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
b6b38f70
JP
2822 cFYI(1, "file mode: 0x%x dir mode: 0x%x",
2823 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3b795210 2824
6d20e840 2825 cifs_sb->actimeo = pvolume_info->actimeo;
724d9f1c 2826 cifs_sb->local_nls = pvolume_info->local_nls;
6d20e840 2827
3b795210
SF
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;
be652445 2842 if (pvolume_info->nostrictsync)
4717bed6 2843 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
13a6e42a
SF
2844 if (pvolume_info->mand_lock)
2845 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
d4ffff1f
PS
2846 if (pvolume_info->rwpidforward)
2847 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3b795210
SF
2848 if (pvolume_info->cifs_acl)
2849 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3d3ea8e6
SP
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;
3b795210
SF
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;
fa1df75d
SJ
2860 if (pvolume_info->fsc)
2861 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
0eb8a132
JL
2862 if (pvolume_info->multiuser)
2863 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
2864 CIFS_MOUNT_NO_PERM);
d39454ff
PS
2865 if (pvolume_info->strict_io)
2866 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3b795210 2867 if (pvolume_info->direct_io) {
b6b38f70 2868 cFYI(1, "mounting share using direct i/o");
3b795210
SF
2869 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
2870 }
736a3320
SM
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");
2875 } else {
2876 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
2877 }
2878 }
3b795210
SF
2879
2880 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
b6b38f70
JP
2881 cERROR(1, "mount option dynperm ignored if cifsacl "
2882 "mount option supported");
b1c8d2b4
JL
2883}
2884
f7910cbd
JL
2885/*
2886 * When the server supports very large writes via POSIX extensions, we can
1190f6a0
JL
2887 * allow up to 2^24-1, minus the size of a WRITE_AND_X header, not including
2888 * the RFC1001 length.
f7910cbd
JL
2889 *
2890 * Note that this might make for "interesting" allocation problems during
1190f6a0
JL
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.
f7910cbd 2893 */
1190f6a0 2894#define CIFS_MAX_WSIZE ((1<<24) - 1 - sizeof(WRITE_REQ) + 4)
f7910cbd
JL
2895
2896/*
1190f6a0 2897 * When the server doesn't allow large posix writes, only allow a wsize of
94443f43 2898 * 2^17-1 minus the size of the WRITE_AND_X header. That allows for a write up
1190f6a0 2899 * to the maximum size described by RFC1002.
f7910cbd 2900 */
94443f43 2901#define CIFS_MAX_RFC1002_WSIZE ((1<<17) - 1 - sizeof(WRITE_REQ) + 4)
f7910cbd
JL
2902
2903/*
2904 * The default wsize is 1M. find_get_pages seems to return a maximum of 256
2905 * pages in a single call. With PAGE_CACHE_SIZE == 4k, this means we can fill
2906 * a single wsize request with a single call.
2907 */
2908#define CIFS_DEFAULT_WSIZE (1024 * 1024)
2909
2910static unsigned int
96daf2b0 2911cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info)
f7910cbd
JL
2912{
2913 __u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2914 struct TCP_Server_Info *server = tcon->ses->server;
2915 unsigned int wsize = pvolume_info->wsize ? pvolume_info->wsize :
2916 CIFS_DEFAULT_WSIZE;
2917
2918 /* can server support 24-bit write sizes? (via UNIX extensions) */
2919 if (!tcon->unix_ext || !(unix_cap & CIFS_UNIX_LARGE_WRITE_CAP))
1190f6a0 2920 wsize = min_t(unsigned int, wsize, CIFS_MAX_RFC1002_WSIZE);
f7910cbd 2921
1190f6a0
JL
2922 /*
2923 * no CAP_LARGE_WRITE_X or is signing enabled without CAP_UNIX set?
2924 * Limit it to max buffer offered by the server, minus the size of the
2925 * WRITEX header, not including the 4 byte RFC1001 length.
2926 */
2927 if (!(server->capabilities & CAP_LARGE_WRITE_X) ||
2928 (!(server->capabilities & CAP_UNIX) &&
2929 (server->sec_mode & (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED))))
2930 wsize = min_t(unsigned int, wsize,
2931 server->maxBuf - sizeof(WRITE_REQ) + 4);
f7910cbd
JL
2932
2933 /* hard limit of CIFS_MAX_WSIZE */
2934 wsize = min_t(unsigned int, wsize, CIFS_MAX_WSIZE);
2935
2936 return wsize;
2937}
2938
e4cce94c 2939static int
96daf2b0 2940is_path_accessible(int xid, struct cifs_tcon *tcon,
e4cce94c
IM
2941 struct cifs_sb_info *cifs_sb, const char *full_path)
2942{
2943 int rc;
e4cce94c
IM
2944 FILE_ALL_INFO *pfile_info;
2945
e4cce94c
IM
2946 pfile_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
2947 if (pfile_info == NULL)
2948 return -ENOMEM;
2949
2950 rc = CIFSSMBQPathInfo(xid, tcon, full_path, pfile_info,
2951 0 /* not legacy */, cifs_sb->local_nls,
2952 cifs_sb->mnt_cifs_flags &
2953 CIFS_MOUNT_MAP_SPECIAL_CHR);
221d1d79
JL
2954
2955 if (rc == -EOPNOTSUPP || rc == -EINVAL)
2956 rc = SMBQueryInformation(xid, tcon, full_path, pfile_info,
2957 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
2958 CIFS_MOUNT_MAP_SPECIAL_CHR);
e4cce94c
IM
2959 kfree(pfile_info);
2960 return rc;
2961}
2962
b9bce2e9
JL
2963static void
2964cleanup_volume_info_contents(struct smb_vol *volume_info)
1bfe73c2 2965{
b946845a 2966 kfree(volume_info->username);
1bfe73c2
IM
2967 kzfree(volume_info->password);
2968 kfree(volume_info->UNC);
13589c43
SF
2969 if (volume_info->UNCip != volume_info->UNC + 2)
2970 kfree(volume_info->UNCip);
b946845a
SF
2971 kfree(volume_info->domainname);
2972 kfree(volume_info->iocharset);
1bfe73c2 2973 kfree(volume_info->prepath);
b9bce2e9
JL
2974}
2975
2976void
2977cifs_cleanup_volume_info(struct smb_vol *volume_info)
2978{
2979 if (!volume_info)
2980 return;
2981 cleanup_volume_info_contents(volume_info);
1bfe73c2 2982 kfree(volume_info);
1bfe73c2
IM
2983}
2984
b9bce2e9 2985
2d6d589d 2986#ifdef CONFIG_CIFS_DFS_UPCALL
1bfe73c2
IM
2987/* build_path_to_root returns full path to root when
2988 * we do not have an exiting connection (tcon) */
2989static char *
b2a0fa15 2990build_unc_path_to_root(const struct smb_vol *vol,
1bfe73c2
IM
2991 const struct cifs_sb_info *cifs_sb)
2992{
b2a0fa15
JL
2993 char *full_path, *pos;
2994 unsigned int pplen = vol->prepath ? strlen(vol->prepath) : 0;
2995 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
1bfe73c2 2996
b2a0fa15 2997 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
1bfe73c2
IM
2998 if (full_path == NULL)
2999 return ERR_PTR(-ENOMEM);
3000
b2a0fa15
JL
3001 strncpy(full_path, vol->UNC, unc_len);
3002 pos = full_path + unc_len;
3003
3004 if (pplen) {
3005 strncpy(pos, vol->prepath, pplen);
3006 pos += pplen;
3007 }
3008
3009 *pos = '\0'; /* add trailing null */
f87d39d9 3010 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
b2a0fa15 3011 cFYI(1, "%s: full_path=%s", __func__, full_path);
1bfe73c2
IM
3012 return full_path;
3013}
dd613945
SF
3014
3015/*
3016 * Perform a dfs referral query for a share and (optionally) prefix
3017 *
046462ab
SF
3018 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3019 * to a string containing updated options for the submount. Otherwise it
3020 * will be left untouched.
dd613945
SF
3021 *
3022 * Returns the rc from get_dfs_path to the caller, which can be used to
3023 * determine whether there were referrals.
3024 */
3025static int
96daf2b0 3026expand_dfs_referral(int xid, struct cifs_ses *pSesInfo,
dd613945 3027 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
046462ab 3028 int check_prefix)
dd613945
SF
3029{
3030 int rc;
3031 unsigned int num_referrals = 0;
3032 struct dfs_info3_param *referrals = NULL;
3033 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
3034
3035 full_path = build_unc_path_to_root(volume_info, cifs_sb);
3036 if (IS_ERR(full_path))
3037 return PTR_ERR(full_path);
3038
3039 /* For DFS paths, skip the first '\' of the UNC */
3040 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
3041
3042 rc = get_dfs_path(xid, pSesInfo , ref_path, cifs_sb->local_nls,
3043 &num_referrals, &referrals,
3044 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
3045
3046 if (!rc && num_referrals > 0) {
3047 char *fake_devname = NULL;
3048
3049 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
3050 full_path + 1, referrals,
3051 &fake_devname);
3052
3053 free_dfs_info_array(referrals, num_referrals);
046462ab 3054
dd613945
SF
3055 if (IS_ERR(mdata)) {
3056 rc = PTR_ERR(mdata);
3057 mdata = NULL;
b9bce2e9
JL
3058 } else {
3059 cleanup_volume_info_contents(volume_info);
3060 memset(volume_info, '\0', sizeof(*volume_info));
3061 rc = cifs_setup_volume_info(volume_info, mdata,
3062 fake_devname);
dd613945 3063 }
b9bce2e9
JL
3064 kfree(fake_devname);
3065 kfree(cifs_sb->mountdata);
046462ab 3066 cifs_sb->mountdata = mdata;
dd613945
SF
3067 }
3068 kfree(full_path);
3069 return rc;
3070}
2d6d589d 3071#endif
1bfe73c2 3072
04db79b0
JL
3073static int
3074cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
3075 const char *devname)
1da177e4 3076{
724d9f1c 3077 int rc = 0;
1da177e4 3078
04db79b0
JL
3079 if (cifs_parse_mount_options(mount_data, devname, volume_info))
3080 return -EINVAL;
1da177e4 3081
7586b765 3082 if (volume_info->nullauth) {
b6b38f70 3083 cFYI(1, "null user");
446b23a7 3084 volume_info->username = kzalloc(1, GFP_KERNEL);
04db79b0
JL
3085 if (volume_info->username == NULL)
3086 return -ENOMEM;
7586b765 3087 } else if (volume_info->username) {
1da177e4 3088 /* BB fixme parse for domain name here */
b6b38f70 3089 cFYI(1, "Username: %s", volume_info->username);
1da177e4 3090 } else {
bf820679 3091 cifserror("No username specified");
50c2f753
SF
3092 /* In userspace mount helper we can get user name from alternate
3093 locations such as env variables and files on disk */
04db79b0 3094 return -EINVAL;
1da177e4
LT
3095 }
3096
1da177e4 3097 /* this is needed for ASCII cp to Unicode converts */
7586b765 3098 if (volume_info->iocharset == NULL) {
a5fc4ce0
JL
3099 /* load_nls_default cannot return null */
3100 volume_info->local_nls = load_nls_default();
1da177e4 3101 } else {
a5fc4ce0
JL
3102 volume_info->local_nls = load_nls(volume_info->iocharset);
3103 if (volume_info->local_nls == NULL) {
b6b38f70
JP
3104 cERROR(1, "CIFS mount error: iocharset %s not found",
3105 volume_info->iocharset);
04db79b0 3106 return -ELIBACC;
1da177e4
LT
3107 }
3108 }
724d9f1c 3109
724d9f1c
PS
3110 return rc;
3111}
3112
04db79b0
JL
3113struct smb_vol *
3114cifs_get_volume_info(char *mount_data, const char *devname)
3115{
3116 int rc;
3117 struct smb_vol *volume_info;
3118
3119 volume_info = kzalloc(sizeof(struct smb_vol), GFP_KERNEL);
3120 if (!volume_info)
3121 return ERR_PTR(-ENOMEM);
3122
3123 rc = cifs_setup_volume_info(volume_info, mount_data, devname);
3124 if (rc) {
3125 cifs_cleanup_volume_info(volume_info);
3126 volume_info = ERR_PTR(rc);
3127 }
3128
3129 return volume_info;
3130}
3131
724d9f1c 3132int
2c6292ae 3133cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
724d9f1c
PS
3134{
3135 int rc = 0;
3136 int xid;
96daf2b0
SF
3137 struct cifs_ses *pSesInfo;
3138 struct cifs_tcon *tcon;
724d9f1c
PS
3139 struct TCP_Server_Info *srvTcp;
3140 char *full_path;
3141 struct tcon_link *tlink;
3142#ifdef CONFIG_CIFS_DFS_UPCALL
3143 int referral_walks_count = 0;
20547490 3144#endif
dd854466
AV
3145
3146 rc = bdi_setup_and_register(&cifs_sb->bdi, "cifs", BDI_CAP_MAP_COPY);
3147 if (rc)
3148 return rc;
3149
3150 cifs_sb->bdi.ra_pages = default_backing_dev_info.ra_pages;
3151
20547490 3152#ifdef CONFIG_CIFS_DFS_UPCALL
724d9f1c
PS
3153try_mount_again:
3154 /* cleanup activities if we're chasing a referral */
3155 if (referral_walks_count) {
3156 if (tcon)
3157 cifs_put_tcon(tcon);
3158 else if (pSesInfo)
3159 cifs_put_smb_ses(pSesInfo);
3160
724d9f1c
PS
3161 FreeXid(xid);
3162 }
3163#endif
3164 tcon = NULL;
3165 pSesInfo = NULL;
3166 srvTcp = NULL;
3167 full_path = NULL;
3168 tlink = NULL;
3169
3170 xid = GetXid();
1da177e4 3171
63c038c2 3172 /* get a reference to a tcp session */
7586b765 3173 srvTcp = cifs_get_tcp_session(volume_info);
63c038c2
JL
3174 if (IS_ERR(srvTcp)) {
3175 rc = PTR_ERR(srvTcp);
dd854466 3176 bdi_destroy(&cifs_sb->bdi);
63c038c2 3177 goto out;
1da177e4
LT
3178 }
3179
36988c76
JL
3180 /* get a reference to a SMB session */
3181 pSesInfo = cifs_get_smb_ses(srvTcp, volume_info);
3182 if (IS_ERR(pSesInfo)) {
3183 rc = PTR_ERR(pSesInfo);
3184 pSesInfo = NULL;
3185 goto mount_fail_check;
1da177e4 3186 }
50c2f753 3187
d00c28de
JL
3188 /* search for existing tcon to this server share */
3189 tcon = cifs_get_tcon(pSesInfo, volume_info);
3190 if (IS_ERR(tcon)) {
3191 rc = PTR_ERR(tcon);
3192 tcon = NULL;
1bfe73c2 3193 goto remote_path_check;
d00c28de 3194 }
1bfe73c2 3195
d82c2df5 3196 /* tell server which Unix caps we support */
6848b733 3197 if (tcon->ses->capabilities & CAP_UNIX) {
d82c2df5
SF
3198 /* reset of caps checks mount to see if unix extensions
3199 disabled for just this mount */
2c6292ae 3200 reset_cifs_unix_caps(xid, tcon, cifs_sb, volume_info);
6848b733
SF
3201 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
3202 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
3203 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)) {
3204 rc = -EACCES;
3205 goto mount_fail_check;
3206 }
3207 } else
d82c2df5 3208 tcon->unix_ext = 0; /* server does not support them */
c18c842b 3209
6848b733
SF
3210 /* do not care if following two calls succeed - informational */
3211 if (!tcon->ipc) {
3212 CIFSSMBQFSDeviceInfo(xid, tcon);
3213 CIFSSMBQFSAttributeInfo(xid, tcon);
3214 }
3215
d82c2df5
SF
3216 if ((tcon->unix_ext == 0) && (cifs_sb->rsize > (1024 * 127))) {
3217 cifs_sb->rsize = 1024 * 127;
b6b38f70 3218 cFYI(DBG2, "no very large read support, rsize now 127K");
1da177e4 3219 }
d82c2df5 3220 if (!(tcon->ses->capabilities & CAP_LARGE_READ_X))
c974befa 3221 cifs_sb->rsize = min(cifs_sb->rsize, CIFSMaxBufSize);
1da177e4 3222
f7910cbd
JL
3223 cifs_sb->wsize = cifs_negotiate_wsize(tcon, volume_info);
3224
1bfe73c2 3225remote_path_check:
c1508ca2
SF
3226#ifdef CONFIG_CIFS_DFS_UPCALL
3227 /*
3228 * Perform an unconditional check for whether there are DFS
3229 * referrals for this path without prefix, to provide support
3230 * for DFS referrals from w2k8 servers which don't seem to respond
3231 * with PATH_NOT_COVERED to requests that include the prefix.
3232 * Chase the referral if found, otherwise continue normally.
3233 */
3234 if (referral_walks_count == 0) {
3235 int refrc = expand_dfs_referral(xid, pSesInfo, volume_info,
046462ab 3236 cifs_sb, false);
c1508ca2
SF
3237 if (!refrc) {
3238 referral_walks_count++;
3239 goto try_mount_again;
3240 }
3241 }
3242#endif
3243
f87d39d9 3244 /* check if a whole path is not remote */
70945643 3245 if (!rc && tcon) {
e4cce94c 3246 /* build_path_to_root works only when we have a valid tcon */
f87d39d9 3247 full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon);
e4cce94c
IM
3248 if (full_path == NULL) {
3249 rc = -ENOMEM;
3250 goto mount_fail_check;
3251 }
3252 rc = is_path_accessible(xid, tcon, cifs_sb, full_path);
03ceace5 3253 if (rc != 0 && rc != -EREMOTE) {
e4cce94c
IM
3254 kfree(full_path);
3255 goto mount_fail_check;
3256 }
3257 kfree(full_path);
3258 }
3259
1bfe73c2
IM
3260 /* get referral if needed */
3261 if (rc == -EREMOTE) {
d036f50f 3262#ifdef CONFIG_CIFS_DFS_UPCALL
5c2503a8
IM
3263 if (referral_walks_count > MAX_NESTED_LINKS) {
3264 /*
3265 * BB: when we implement proper loop detection,
3266 * we will remove this check. But now we need it
3267 * to prevent an indefinite loop if 'DFS tree' is
3268 * misconfigured (i.e. has loops).
3269 */
3270 rc = -ELOOP;
3271 goto mount_fail_check;
3272 }
1bfe73c2 3273
dd613945 3274 rc = expand_dfs_referral(xid, pSesInfo, volume_info, cifs_sb,
046462ab 3275 true);
7b91e266 3276
dd613945 3277 if (!rc) {
5c2503a8 3278 referral_walks_count++;
1bfe73c2
IM
3279 goto try_mount_again;
3280 }
dd613945 3281 goto mount_fail_check;
d036f50f
SF
3282#else /* No DFS support, return error on mount */
3283 rc = -EOPNOTSUPP;
3284#endif
1bfe73c2
IM
3285 }
3286
9d002df4
JL
3287 if (rc)
3288 goto mount_fail_check;
3289
3290 /* now, hang the tcon off of the superblock */
3291 tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
3292 if (tlink == NULL) {
3293 rc = -ENOMEM;
3294 goto mount_fail_check;
3295 }
3296
b647c35f 3297 tlink->tl_uid = pSesInfo->linux_uid;
9d002df4
JL
3298 tlink->tl_tcon = tcon;
3299 tlink->tl_time = jiffies;
3300 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
3301 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3302
b647c35f 3303 cifs_sb->master_tlink = tlink;
9d002df4 3304 spin_lock(&cifs_sb->tlink_tree_lock);
b647c35f 3305 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
9d002df4 3306 spin_unlock(&cifs_sb->tlink_tree_lock);
413e661c 3307
2de970ff
JL
3308 queue_delayed_work(system_nrt_wq, &cifs_sb->prune_tlinks,
3309 TLINK_IDLE_EXPIRE);
3310
1bfe73c2
IM
3311mount_fail_check:
3312 /* on error free sesinfo and tcon struct if needed */
3313 if (rc) {
1bfe73c2 3314 /* If find_unc succeeded then rc == 0 so we can not end */
25985edc 3315 /* up accidentally freeing someone elses tcon struct */
1bfe73c2
IM
3316 if (tcon)
3317 cifs_put_tcon(tcon);
3318 else if (pSesInfo)
3319 cifs_put_smb_ses(pSesInfo);
3320 else
3321 cifs_put_tcp_session(srvTcp);
dd854466 3322 bdi_destroy(&cifs_sb->bdi);
1bfe73c2
IM
3323 }
3324
70fe7dc0 3325out:
1da177e4
LT
3326 FreeXid(xid);
3327 return rc;
3328}
3329
8d1bca32
JL
3330/*
3331 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3332 * pointer may be NULL.
3333 */
1da177e4 3334int
96daf2b0
SF
3335CIFSTCon(unsigned int xid, struct cifs_ses *ses,
3336 const char *tree, struct cifs_tcon *tcon,
1da177e4
LT
3337 const struct nls_table *nls_codepage)
3338{
3339 struct smb_hdr *smb_buffer;
3340 struct smb_hdr *smb_buffer_response;
3341 TCONX_REQ *pSMB;
3342 TCONX_RSP *pSMBr;
3343 unsigned char *bcc_ptr;
3344 int rc = 0;
690c522f
JL
3345 int length;
3346 __u16 bytes_left, count;
1da177e4
LT
3347
3348 if (ses == NULL)
3349 return -EIO;
3350
3351 smb_buffer = cifs_buf_get();
ca43e3be 3352 if (smb_buffer == NULL)
1da177e4 3353 return -ENOMEM;
ca43e3be 3354
1da177e4
LT
3355 smb_buffer_response = smb_buffer;
3356
3357 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3358 NULL /*no tid */ , 4 /*wct */ );
1982c344
SF
3359
3360 smb_buffer->Mid = GetNextMid(ses->server);
1da177e4
LT
3361 smb_buffer->Uid = ses->Suid;
3362 pSMB = (TCONX_REQ *) smb_buffer;
3363 pSMBr = (TCONX_RSP *) smb_buffer_response;
3364
3365 pSMB->AndXCommand = 0xFF;
3366 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
1da177e4 3367 bcc_ptr = &pSMB->Password[0];
8d1bca32 3368 if (!tcon || (ses->server->sec_mode & SECMODE_USER)) {
eeac8047 3369 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
7c7b25bc 3370 *bcc_ptr = 0; /* password is null byte */
eeac8047 3371 bcc_ptr++; /* skip password */
7c7b25bc 3372 /* already aligned so no need to do it below */
eeac8047 3373 } else {
540b2e37 3374 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
eeac8047
SF
3375 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3376 specified as required (when that support is added to
3377 the vfs in the future) as only NTLM or the much
7c7b25bc 3378 weaker LANMAN (which we do not send by default) is accepted
eeac8047
SF
3379 by Samba (not sure whether other servers allow
3380 NTLMv2 password here) */
7c7b25bc 3381#ifdef CONFIG_CIFS_WEAK_PW_HASH
04912d6a 3382 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
00e485b0 3383 (ses->server->secType == LANMAN))
d3ba50b1 3384 calc_lanman_hash(tcon->password, ses->server->cryptkey,
96daf2b0 3385 ses->server->sec_mode &
4e53a3fb
JL
3386 SECMODE_PW_ENCRYPT ? true : false,
3387 bcc_ptr);
7c7b25bc
SF
3388 else
3389#endif /* CIFS_WEAK_PW_HASH */
ee2c9258
SP
3390 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3391 bcc_ptr);
eeac8047 3392
540b2e37 3393 bcc_ptr += CIFS_AUTH_RESP_SIZE;
fb8c4b14 3394 if (ses->capabilities & CAP_UNICODE) {
7c7b25bc
SF
3395 /* must align unicode strings */
3396 *bcc_ptr = 0; /* null byte password */
3397 bcc_ptr++;
3398 }
eeac8047 3399 }
1da177e4 3400
96daf2b0 3401 if (ses->server->sec_mode &
a878fb22 3402 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
1da177e4
LT
3403 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3404
3405 if (ses->capabilities & CAP_STATUS32) {
3406 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3407 }
3408 if (ses->capabilities & CAP_DFS) {
3409 smb_buffer->Flags2 |= SMBFLG2_DFS;
3410 }
3411 if (ses->capabilities & CAP_UNICODE) {
3412 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3413 length =
50c2f753
SF
3414 cifs_strtoUCS((__le16 *) bcc_ptr, tree,
3415 6 /* max utf8 char length in bytes */ *
a878fb22
SF
3416 (/* server len*/ + 256 /* share len */), nls_codepage);
3417 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
1da177e4
LT
3418 bcc_ptr += 2; /* skip trailing null */
3419 } else { /* ASCII */
1da177e4
LT
3420 strcpy(bcc_ptr, tree);
3421 bcc_ptr += strlen(tree) + 1;
3422 }
3423 strcpy(bcc_ptr, "?????");
3424 bcc_ptr += strlen("?????");
3425 bcc_ptr += 1;
3426 count = bcc_ptr - &pSMB->Password[0];
be8e3b00
SF
3427 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
3428 pSMB->hdr.smb_buf_length) + count);
1da177e4
LT
3429 pSMB->ByteCount = cpu_to_le16(count);
3430
133672ef 3431 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
7749981e 3432 0);
1da177e4 3433
1da177e4
LT
3434 /* above now done in SendReceive */
3435 if ((rc == 0) && (tcon != NULL)) {
0e0d2cf3
SF
3436 bool is_unicode;
3437
1da177e4 3438 tcon->tidStatus = CifsGood;
3b795210 3439 tcon->need_reconnect = false;
1da177e4
LT
3440 tcon->tid = smb_buffer_response->Tid;
3441 bcc_ptr = pByteArea(smb_buffer_response);
690c522f 3442 bytes_left = get_bcc(smb_buffer_response);
cc20c031 3443 length = strnlen(bcc_ptr, bytes_left - 2);
0e0d2cf3
SF
3444 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3445 is_unicode = true;
3446 else
3447 is_unicode = false;
3448
cc20c031 3449
50c2f753 3450 /* skip service field (NB: this field is always ASCII) */
7f8ed420
SF
3451 if (length == 3) {
3452 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3453 (bcc_ptr[2] == 'C')) {
b6b38f70 3454 cFYI(1, "IPC connection");
7f8ed420
SF
3455 tcon->ipc = 1;
3456 }
3457 } else if (length == 2) {
3458 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3459 /* the most common case */
b6b38f70 3460 cFYI(1, "disk share connection");
7f8ed420
SF
3461 }
3462 }
50c2f753 3463 bcc_ptr += length + 1;
cc20c031 3464 bytes_left -= (length + 1);
1da177e4 3465 strncpy(tcon->treeName, tree, MAX_TREE_SIZE);
cc20c031
JL
3466
3467 /* mostly informational -- no need to fail on error here */
90a98b2f 3468 kfree(tcon->nativeFileSystem);
d185cda7 3469 tcon->nativeFileSystem = cifs_strndup_from_ucs(bcc_ptr,
0e0d2cf3 3470 bytes_left, is_unicode,
cc20c031
JL
3471 nls_codepage);
3472
b6b38f70 3473 cFYI(1, "nativeFileSystem=%s", tcon->nativeFileSystem);
cc20c031 3474
fb8c4b14 3475 if ((smb_buffer_response->WordCount == 3) ||
1a4e15a0
SF
3476 (smb_buffer_response->WordCount == 7))
3477 /* field is in same location */
3979877e
SF
3478 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3479 else
3480 tcon->Flags = 0;
b6b38f70 3481 cFYI(1, "Tcon flags: 0x%x ", tcon->Flags);
1da177e4 3482 } else if ((rc == 0) && tcon == NULL) {
50c2f753 3483 /* all we need to save for IPC$ connection */
1da177e4
LT
3484 ses->ipc_tid = smb_buffer_response->Tid;
3485 }
3486
a8a11d39 3487 cifs_buf_release(smb_buffer);
1da177e4
LT
3488 return rc;
3489}
3490
2a9b9951
AV
3491void
3492cifs_umount(struct cifs_sb_info *cifs_sb)
1da177e4 3493{
b647c35f
JL
3494 struct rb_root *root = &cifs_sb->tlink_tree;
3495 struct rb_node *node;
3496 struct tcon_link *tlink;
9d002df4 3497
2de970ff
JL
3498 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3499
b647c35f
JL
3500 spin_lock(&cifs_sb->tlink_tree_lock);
3501 while ((node = rb_first(root))) {
3502 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3503 cifs_get_tlink(tlink);
3504 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3505 rb_erase(node, root);
1da177e4 3506
b647c35f
JL
3507 spin_unlock(&cifs_sb->tlink_tree_lock);
3508 cifs_put_tlink(tlink);
3509 spin_lock(&cifs_sb->tlink_tree_lock);
3510 }
3511 spin_unlock(&cifs_sb->tlink_tree_lock);
50c2f753 3512
dd854466 3513 bdi_destroy(&cifs_sb->bdi);
d757d71b
AV
3514 kfree(cifs_sb->mountdata);
3515 unload_nls(cifs_sb->local_nls);
3516 kfree(cifs_sb);
50c2f753 3517}
1da177e4 3518
96daf2b0 3519int cifs_negotiate_protocol(unsigned int xid, struct cifs_ses *ses)
1da177e4
LT
3520{
3521 int rc = 0;
198b5682 3522 struct TCP_Server_Info *server = ses->server;
1da177e4 3523
198b5682
JL
3524 /* only send once per connect */
3525 if (server->maxBuf != 0)
3526 return 0;
3527
3528 rc = CIFSSMBNegotiate(xid, ses);
3529 if (rc == -EAGAIN) {
3530 /* retry only once on 1st time connection */
3531 rc = CIFSSMBNegotiate(xid, ses);
3532 if (rc == -EAGAIN)
3533 rc = -EHOSTDOWN;
1da177e4 3534 }
198b5682
JL
3535 if (rc == 0) {
3536 spin_lock(&GlobalMid_Lock);
7fdbaa1b 3537 if (server->tcpStatus == CifsNeedNegotiate)
198b5682
JL
3538 server->tcpStatus = CifsGood;
3539 else
3540 rc = -EHOSTDOWN;
3541 spin_unlock(&GlobalMid_Lock);
26b994fa 3542
198b5682
JL
3543 }
3544
3545 return rc;
3546}
3547
3548
96daf2b0 3549int cifs_setup_session(unsigned int xid, struct cifs_ses *ses,
198b5682
JL
3550 struct nls_table *nls_info)
3551{
3552 int rc = 0;
3553 struct TCP_Server_Info *server = ses->server;
26b994fa 3554
198b5682
JL
3555 ses->flags = 0;
3556 ses->capabilities = server->capabilities;
26b994fa 3557 if (linuxExtEnabled == 0)
198b5682 3558 ses->capabilities &= (~CAP_UNIX);
20418acd 3559
b6b38f70 3560 cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
96daf2b0 3561 server->sec_mode, server->capabilities, server->timeAdj);
cb7691b6 3562
198b5682 3563 rc = CIFS_SessSetup(xid, ses, nls_info);
26b994fa 3564 if (rc) {
b6b38f70 3565 cERROR(1, "Send error in SessSetup = %d", rc);
26b994fa 3566 } else {
5d0d2882
SP
3567 mutex_lock(&ses->server->srv_mutex);
3568 if (!server->session_estab) {
21e73393 3569 server->session_key.response = ses->auth_key.response;
5d0d2882 3570 server->session_key.len = ses->auth_key.len;
21e73393
SP
3571 server->sequence_number = 0x2;
3572 server->session_estab = true;
3573 ses->auth_key.response = NULL;
5d0d2882
SP
3574 }
3575 mutex_unlock(&server->srv_mutex);
3576
b6b38f70 3577 cFYI(1, "CIFS Session Established successfully");
20418acd 3578 spin_lock(&GlobalMid_Lock);
198b5682
JL
3579 ses->status = CifsGood;
3580 ses->need_reconnect = false;
20418acd 3581 spin_unlock(&GlobalMid_Lock);
1da177e4 3582 }
26b994fa 3583
21e73393
SP
3584 kfree(ses->auth_key.response);
3585 ses->auth_key.response = NULL;
3586 ses->auth_key.len = 0;
d3686d54
SP
3587 kfree(ses->ntlmssp);
3588 ses->ntlmssp = NULL;
21e73393 3589
1da177e4
LT
3590 return rc;
3591}
3592
96daf2b0 3593static struct cifs_tcon *
9d002df4
JL
3594cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid)
3595{
96daf2b0
SF
3596 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
3597 struct cifs_ses *ses;
3598 struct cifs_tcon *tcon = NULL;
9d002df4 3599 struct smb_vol *vol_info;
34c87901
SF
3600 char username[28]; /* big enough for "krb50x" + hex of ULONG_MAX 6+16 */
3601 /* We used to have this as MAX_USERNAME which is */
3602 /* way too big now (256 instead of 32) */
9d002df4
JL
3603
3604 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
3605 if (vol_info == NULL) {
3606 tcon = ERR_PTR(-ENOMEM);
3607 goto out;
3608 }
3609
ea1be1a3 3610 snprintf(username, sizeof(username), "krb50x%x", fsuid);
9d002df4
JL
3611 vol_info->username = username;
3612 vol_info->local_nls = cifs_sb->local_nls;
3613 vol_info->linux_uid = fsuid;
3614 vol_info->cred_uid = fsuid;
3615 vol_info->UNC = master_tcon->treeName;
3616 vol_info->retry = master_tcon->retry;
3617 vol_info->nocase = master_tcon->nocase;
3618 vol_info->local_lease = master_tcon->local_lease;
3619 vol_info->no_linux_ext = !master_tcon->unix_ext;
3620
3621 /* FIXME: allow for other secFlg settings */
3622 vol_info->secFlg = CIFSSEC_MUST_KRB5;
3623
3624 /* get a reference for the same TCP session */
3f9bcca7 3625 spin_lock(&cifs_tcp_ses_lock);
9d002df4 3626 ++master_tcon->ses->server->srv_count;
3f9bcca7 3627 spin_unlock(&cifs_tcp_ses_lock);
9d002df4
JL
3628
3629 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
3630 if (IS_ERR(ses)) {
96daf2b0 3631 tcon = (struct cifs_tcon *)ses;
9d002df4
JL
3632 cifs_put_tcp_session(master_tcon->ses->server);
3633 goto out;
3634 }
3635
3636 tcon = cifs_get_tcon(ses, vol_info);
3637 if (IS_ERR(tcon)) {
3638 cifs_put_smb_ses(ses);
3639 goto out;
3640 }
3641
3642 if (ses->capabilities & CAP_UNIX)
3643 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
3644out:
3645 kfree(vol_info);
3646
3647 return tcon;
3648}
3649
96daf2b0 3650struct cifs_tcon *
9d002df4
JL
3651cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
3652{
3653 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
3654}
3655
3656static int
3657cifs_sb_tcon_pending_wait(void *unused)
3658{
3659 schedule();
3660 return signal_pending(current) ? -ERESTARTSYS : 0;
3661}
3662
b647c35f
JL
3663/* find and return a tlink with given uid */
3664static struct tcon_link *
3665tlink_rb_search(struct rb_root *root, uid_t uid)
3666{
3667 struct rb_node *node = root->rb_node;
3668 struct tcon_link *tlink;
3669
3670 while (node) {
3671 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3672
3673 if (tlink->tl_uid > uid)
3674 node = node->rb_left;
3675 else if (tlink->tl_uid < uid)
3676 node = node->rb_right;
3677 else
3678 return tlink;
3679 }
3680 return NULL;
3681}
3682
3683/* insert a tcon_link into the tree */
3684static void
3685tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
3686{
3687 struct rb_node **new = &(root->rb_node), *parent = NULL;
3688 struct tcon_link *tlink;
3689
3690 while (*new) {
3691 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
3692 parent = *new;
3693
3694 if (tlink->tl_uid > new_tlink->tl_uid)
3695 new = &((*new)->rb_left);
3696 else
3697 new = &((*new)->rb_right);
3698 }
3699
3700 rb_link_node(&new_tlink->tl_rbnode, parent, new);
3701 rb_insert_color(&new_tlink->tl_rbnode, root);
3702}
3703
9d002df4
JL
3704/*
3705 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
3706 * current task.
3707 *
3708 * If the superblock doesn't refer to a multiuser mount, then just return
3709 * the master tcon for the mount.
3710 *
6ef933a3 3711 * First, search the rbtree for an existing tcon for this fsuid. If one
9d002df4
JL
3712 * exists, then check to see if it's pending construction. If it is then wait
3713 * for construction to complete. Once it's no longer pending, check to see if
3714 * it failed and either return an error or retry construction, depending on
3715 * the timeout.
3716 *
3717 * If one doesn't exist then insert a new tcon_link struct into the tree and
3718 * try to construct a new one.
3719 */
3720struct tcon_link *
3721cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
3722{
3723 int ret;
b647c35f 3724 uid_t fsuid = current_fsuid();
9d002df4
JL
3725 struct tcon_link *tlink, *newtlink;
3726
3727 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
3728 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3729
3730 spin_lock(&cifs_sb->tlink_tree_lock);
b647c35f 3731 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
9d002df4
JL
3732 if (tlink)
3733 cifs_get_tlink(tlink);
3734 spin_unlock(&cifs_sb->tlink_tree_lock);
3735
3736 if (tlink == NULL) {
3737 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
3738 if (newtlink == NULL)
3739 return ERR_PTR(-ENOMEM);
b647c35f 3740 newtlink->tl_uid = fsuid;
9d002df4
JL
3741 newtlink->tl_tcon = ERR_PTR(-EACCES);
3742 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
3743 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
3744 cifs_get_tlink(newtlink);
3745
9d002df4
JL
3746 spin_lock(&cifs_sb->tlink_tree_lock);
3747 /* was one inserted after previous search? */
b647c35f 3748 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
9d002df4
JL
3749 if (tlink) {
3750 cifs_get_tlink(tlink);
3751 spin_unlock(&cifs_sb->tlink_tree_lock);
9d002df4
JL
3752 kfree(newtlink);
3753 goto wait_for_construction;
3754 }
9d002df4 3755 tlink = newtlink;
b647c35f
JL
3756 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3757 spin_unlock(&cifs_sb->tlink_tree_lock);
9d002df4
JL
3758 } else {
3759wait_for_construction:
3760 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
3761 cifs_sb_tcon_pending_wait,
3762 TASK_INTERRUPTIBLE);
3763 if (ret) {
3764 cifs_put_tlink(tlink);
3765 return ERR_PTR(ret);
3766 }
3767
3768 /* if it's good, return it */
3769 if (!IS_ERR(tlink->tl_tcon))
3770 return tlink;
3771
3772 /* return error if we tried this already recently */
3773 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
3774 cifs_put_tlink(tlink);
3775 return ERR_PTR(-EACCES);
3776 }
3777
3778 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
3779 goto wait_for_construction;
3780 }
3781
3782 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
3783 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
3784 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
3785
3786 if (IS_ERR(tlink->tl_tcon)) {
3787 cifs_put_tlink(tlink);
3788 return ERR_PTR(-EACCES);
3789 }
3790
3791 return tlink;
3792}
2de970ff
JL
3793
3794/*
3795 * periodic workqueue job that scans tcon_tree for a superblock and closes
3796 * out tcons.
3797 */
3798static void
3799cifs_prune_tlinks(struct work_struct *work)
3800{
3801 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
3802 prune_tlinks.work);
b647c35f
JL
3803 struct rb_root *root = &cifs_sb->tlink_tree;
3804 struct rb_node *node = rb_first(root);
3805 struct rb_node *tmp;
3806 struct tcon_link *tlink;
2de970ff 3807
b647c35f
JL
3808 /*
3809 * Because we drop the spinlock in the loop in order to put the tlink
3810 * it's not guarded against removal of links from the tree. The only
3811 * places that remove entries from the tree are this function and
3812 * umounts. Because this function is non-reentrant and is canceled
3813 * before umount can proceed, this is safe.
3814 */
3815 spin_lock(&cifs_sb->tlink_tree_lock);
3816 node = rb_first(root);
3817 while (node != NULL) {
3818 tmp = node;
3819 node = rb_next(tmp);
3820 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
3821
3822 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
3823 atomic_read(&tlink->tl_count) != 0 ||
3824 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
3825 continue;
2de970ff 3826
b647c35f
JL
3827 cifs_get_tlink(tlink);
3828 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3829 rb_erase(tmp, root);
3830
3831 spin_unlock(&cifs_sb->tlink_tree_lock);
3832 cifs_put_tlink(tlink);
3833 spin_lock(&cifs_sb->tlink_tree_lock);
3834 }
3835 spin_unlock(&cifs_sb->tlink_tree_lock);
2de970ff
JL
3836
3837 queue_delayed_work(system_nrt_wq, &cifs_sb->prune_tlinks,
3838 TLINK_IDLE_EXPIRE);
3839}
This page took 1.214428 seconds and 5 git commands to generate.