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