]> bbs.cooldavid.org Git - net-next-2.6.git/blame - fs/cifs/connect.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[net-next-2.6.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"
a2653eba 50#include "cn_cifs.h"
488f1d2d 51#include "fscache.h"
1da177e4
LT
52
53#define CIFS_PORT 445
54#define RFC1001_PORT 139
55
1da177e4
LT
56extern void SMBNTencrypt(unsigned char *passwd, unsigned char *c8,
57 unsigned char *p24);
58
59extern mempool_t *cifs_req_poolp;
60
61struct smb_vol {
62 char *username;
63 char *password;
64 char *domainname;
65 char *UNC;
66 char *UNCip;
1da177e4
LT
67 char *iocharset; /* local code page for mapping to and from Unicode */
68 char source_rfc1001_name[16]; /* netbios name of client */
a10faeb2 69 char target_rfc1001_name[16]; /* netbios name of server for Win9x/ME */
3e4b3e1f 70 uid_t cred_uid;
1da177e4
LT
71 uid_t linux_uid;
72 gid_t linux_gid;
73 mode_t file_mode;
74 mode_t dir_mode;
189acaae 75 unsigned secFlg;
4b18f2a9
SF
76 bool retry:1;
77 bool intr:1;
78 bool setuids:1;
79 bool override_uid:1;
80 bool override_gid:1;
d0a9c078 81 bool dynperm:1;
4b18f2a9
SF
82 bool noperm:1;
83 bool no_psx_acl:1; /* set if posix acl support should be disabled */
84 bool cifs_acl:1;
85 bool no_xattr:1; /* set if xattr (EA) support should be disabled*/
86 bool server_ino:1; /* use inode numbers from server ie UniqueId */
87 bool direct_io:1;
95b1cb90
SF
88 bool remap:1; /* set to remap seven reserved chars in filenames */
89 bool posix_paths:1; /* unset to not ask for posix pathnames. */
4b18f2a9
SF
90 bool no_linux_ext:1;
91 bool sfu_emul:1;
95b1cb90
SF
92 bool nullauth:1; /* attempt to authenticate with null user */
93 bool nocase:1; /* request case insensitive filenames */
94 bool nobrl:1; /* disable sending byte range locks to srv */
13a6e42a 95 bool mand_lock:1; /* send mandatory not posix byte range lock reqs */
95b1cb90 96 bool seal:1; /* request transport encryption on share */
84210e91
SF
97 bool nodfs:1; /* Do not request DFS, even if available */
98 bool local_lease:1; /* check leases only on local system, not remote */
edf1ae40
SF
99 bool noblocksnd:1;
100 bool noautotune:1;
be652445 101 bool nostrictsync:1; /* do not force expensive SMBflush on every sync */
fa1df75d 102 bool fsc:1; /* enable fscache */
1da177e4
LT
103 unsigned int rsize;
104 unsigned int wsize;
6a5fa236 105 bool sockopt_tcp_nodelay:1;
1da177e4 106 unsigned short int port;
fb8c4b14 107 char *prepath;
a5fc4ce0 108 struct nls_table *local_nls;
1da177e4
LT
109};
110
bcf4b106 111static int ipv4_connect(struct TCP_Server_Info *server);
d5c5605c 112static int ipv6_connect(struct TCP_Server_Info *server);
1da177e4 113
d5c5605c
JL
114/*
115 * cifs tcp session reconnection
116 *
117 * mark tcp session as reconnecting so temporarily locked
118 * mark all smb sessions as reconnecting for tcp session
119 * reconnect tcp session
120 * wake up waiters on reconnection? - (not needed currently)
121 */
2cd646a2 122static int
1da177e4
LT
123cifs_reconnect(struct TCP_Server_Info *server)
124{
125 int rc = 0;
f1987b44 126 struct list_head *tmp, *tmp2;
1da177e4
LT
127 struct cifsSesInfo *ses;
128 struct cifsTconInfo *tcon;
fb8c4b14 129 struct mid_q_entry *mid_entry;
50c2f753 130
1da177e4 131 spin_lock(&GlobalMid_Lock);
469ee614 132 if (server->tcpStatus == CifsExiting) {
fb8c4b14 133 /* the demux thread will exit normally
1da177e4
LT
134 next time through the loop */
135 spin_unlock(&GlobalMid_Lock);
136 return rc;
137 } else
138 server->tcpStatus = CifsNeedReconnect;
139 spin_unlock(&GlobalMid_Lock);
140 server->maxBuf = 0;
141
b6b38f70 142 cFYI(1, "Reconnecting tcp session");
1da177e4
LT
143
144 /* before reconnecting the tcp session, mark the smb session (uid)
145 and the tid bad so they are not used until reconnected */
14fbf50d
JL
146 read_lock(&cifs_tcp_ses_lock);
147 list_for_each(tmp, &server->smb_ses_list) {
148 ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list);
149 ses->need_reconnect = true;
150 ses->ipc_tid = 0;
f1987b44
JL
151 list_for_each(tmp2, &ses->tcon_list) {
152 tcon = list_entry(tmp2, struct cifsTconInfo, tcon_list);
3b795210 153 tcon->need_reconnect = true;
1da177e4 154 }
1da177e4 155 }
f1987b44 156 read_unlock(&cifs_tcp_ses_lock);
1da177e4 157 /* do not want to be sending data on a socket we are freeing */
72ca545b 158 mutex_lock(&server->srv_mutex);
fb8c4b14 159 if (server->ssocket) {
b6b38f70
JP
160 cFYI(1, "State: 0x%x Flags: 0x%lx", server->ssocket->state,
161 server->ssocket->flags);
91cf45f0 162 kernel_sock_shutdown(server->ssocket, SHUT_WR);
b6b38f70 163 cFYI(1, "Post shutdown state: 0x%x Flags: 0x%lx",
467a8f8d 164 server->ssocket->state,
b6b38f70 165 server->ssocket->flags);
1da177e4
LT
166 sock_release(server->ssocket);
167 server->ssocket = NULL;
168 }
169
170 spin_lock(&GlobalMid_Lock);
171 list_for_each(tmp, &server->pending_mid_q) {
172 mid_entry = list_entry(tmp, struct
173 mid_q_entry,
174 qhead);
ad8b15f0 175 if (mid_entry->midState == MID_REQUEST_SUBMITTED) {
09d1db5c
SF
176 /* Mark other intransit requests as needing
177 retry so we do not immediately mark the
178 session bad again (ie after we reconnect
179 below) as they timeout too */
ad8b15f0 180 mid_entry->midState = MID_RETRY_NEEDED;
1da177e4
LT
181 }
182 }
183 spin_unlock(&GlobalMid_Lock);
72ca545b 184 mutex_unlock(&server->srv_mutex);
1da177e4 185
469ee614
JL
186 while ((server->tcpStatus != CifsExiting) &&
187 (server->tcpStatus != CifsGood)) {
6c3d8909 188 try_to_freeze();
bcf4b106 189 if (server->addr.sockAddr6.sin6_family == AF_INET6)
d5c5605c 190 rc = ipv6_connect(server);
bcf4b106
JL
191 else
192 rc = ipv4_connect(server);
fb8c4b14 193 if (rc) {
b6b38f70 194 cFYI(1, "reconnect error %d", rc);
0cb766ae 195 msleep(3000);
1da177e4
LT
196 } else {
197 atomic_inc(&tcpSesReconnectCount);
198 spin_lock(&GlobalMid_Lock);
469ee614 199 if (server->tcpStatus != CifsExiting)
1da177e4 200 server->tcpStatus = CifsGood;
ad009ac9 201 server->sequence_number = 0;
fb8c4b14 202 spin_unlock(&GlobalMid_Lock);
1da177e4
LT
203 /* atomic_set(&server->inFlight,0);*/
204 wake_up(&server->response_q);
205 }
206 }
207 return rc;
208}
209
fb8c4b14 210/*
e4eb295d
SF
211 return codes:
212 0 not a transact2, or all data present
213 >0 transact2 with that much data missing
214 -EINVAL = invalid transact2
215
216 */
fb8c4b14 217static int check2ndT2(struct smb_hdr *pSMB, unsigned int maxBufSize)
e4eb295d 218{
fb8c4b14
SF
219 struct smb_t2_rsp *pSMBt;
220 int total_data_size;
e4eb295d
SF
221 int data_in_this_rsp;
222 int remaining;
223
fb8c4b14 224 if (pSMB->Command != SMB_COM_TRANSACTION2)
e4eb295d
SF
225 return 0;
226
fb8c4b14
SF
227 /* check for plausible wct, bcc and t2 data and parm sizes */
228 /* check for parm and data offset going beyond end of smb */
229 if (pSMB->WordCount != 10) { /* coalesce_t2 depends on this */
b6b38f70 230 cFYI(1, "invalid transact2 word count");
e4eb295d
SF
231 return -EINVAL;
232 }
233
234 pSMBt = (struct smb_t2_rsp *)pSMB;
235
236 total_data_size = le16_to_cpu(pSMBt->t2_rsp.TotalDataCount);
237 data_in_this_rsp = le16_to_cpu(pSMBt->t2_rsp.DataCount);
238
239 remaining = total_data_size - data_in_this_rsp;
240
fb8c4b14 241 if (remaining == 0)
e4eb295d 242 return 0;
fb8c4b14 243 else if (remaining < 0) {
b6b38f70
JP
244 cFYI(1, "total data %d smaller than data in frame %d",
245 total_data_size, data_in_this_rsp);
e4eb295d
SF
246 return -EINVAL;
247 } else {
b6b38f70
JP
248 cFYI(1, "missing %d bytes from transact2, check next response",
249 remaining);
fb8c4b14 250 if (total_data_size > maxBufSize) {
b6b38f70
JP
251 cERROR(1, "TotalDataSize %d is over maximum buffer %d",
252 total_data_size, maxBufSize);
fb8c4b14 253 return -EINVAL;
e4eb295d
SF
254 }
255 return remaining;
256 }
257}
258
fb8c4b14 259static int coalesce_t2(struct smb_hdr *psecond, struct smb_hdr *pTargetSMB)
e4eb295d
SF
260{
261 struct smb_t2_rsp *pSMB2 = (struct smb_t2_rsp *)psecond;
262 struct smb_t2_rsp *pSMBt = (struct smb_t2_rsp *)pTargetSMB;
263 int total_data_size;
264 int total_in_buf;
265 int remaining;
266 int total_in_buf2;
fb8c4b14
SF
267 char *data_area_of_target;
268 char *data_area_of_buf2;
e4eb295d
SF
269 __u16 byte_count;
270
271 total_data_size = le16_to_cpu(pSMBt->t2_rsp.TotalDataCount);
272
fb8c4b14 273 if (total_data_size != le16_to_cpu(pSMB2->t2_rsp.TotalDataCount)) {
b6b38f70 274 cFYI(1, "total data size of primary and secondary t2 differ");
e4eb295d
SF
275 }
276
277 total_in_buf = le16_to_cpu(pSMBt->t2_rsp.DataCount);
278
279 remaining = total_data_size - total_in_buf;
50c2f753 280
fb8c4b14 281 if (remaining < 0)
e4eb295d
SF
282 return -EINVAL;
283
fb8c4b14 284 if (remaining == 0) /* nothing to do, ignore */
e4eb295d 285 return 0;
50c2f753 286
e4eb295d 287 total_in_buf2 = le16_to_cpu(pSMB2->t2_rsp.DataCount);
fb8c4b14 288 if (remaining < total_in_buf2) {
b6b38f70 289 cFYI(1, "transact2 2nd response contains too much data");
e4eb295d
SF
290 }
291
292 /* find end of first SMB data area */
fb8c4b14 293 data_area_of_target = (char *)&pSMBt->hdr.Protocol +
e4eb295d
SF
294 le16_to_cpu(pSMBt->t2_rsp.DataOffset);
295 /* validate target area */
296
297 data_area_of_buf2 = (char *) &pSMB2->hdr.Protocol +
fb8c4b14 298 le16_to_cpu(pSMB2->t2_rsp.DataOffset);
e4eb295d
SF
299
300 data_area_of_target += total_in_buf;
301
302 /* copy second buffer into end of first buffer */
fb8c4b14 303 memcpy(data_area_of_target, data_area_of_buf2, total_in_buf2);
e4eb295d
SF
304 total_in_buf += total_in_buf2;
305 pSMBt->t2_rsp.DataCount = cpu_to_le16(total_in_buf);
306 byte_count = le16_to_cpu(BCC_LE(pTargetSMB));
307 byte_count += total_in_buf2;
308 BCC_LE(pTargetSMB) = cpu_to_le16(byte_count);
309
70ca734a 310 byte_count = pTargetSMB->smb_buf_length;
e4eb295d
SF
311 byte_count += total_in_buf2;
312
313 /* BB also add check that we are not beyond maximum buffer size */
50c2f753 314
70ca734a 315 pTargetSMB->smb_buf_length = byte_count;
e4eb295d 316
fb8c4b14 317 if (remaining == total_in_buf2) {
b6b38f70 318 cFYI(1, "found the last secondary response");
e4eb295d
SF
319 return 0; /* we are done */
320 } else /* more responses to go */
321 return 1;
322
323}
324
1da177e4
LT
325static int
326cifs_demultiplex_thread(struct TCP_Server_Info *server)
327{
328 int length;
329 unsigned int pdu_length, total_read;
330 struct smb_hdr *smb_buffer = NULL;
b8643e1b
SF
331 struct smb_hdr *bigbuf = NULL;
332 struct smb_hdr *smallbuf = NULL;
1da177e4
LT
333 struct msghdr smb_msg;
334 struct kvec iov;
335 struct socket *csocket = server->ssocket;
336 struct list_head *tmp;
337 struct cifsSesInfo *ses;
338 struct task_struct *task_to_wake = NULL;
339 struct mid_q_entry *mid_entry;
70ca734a 340 char temp;
4b18f2a9
SF
341 bool isLargeBuf = false;
342 bool isMultiRsp;
e4eb295d 343 int reconnect;
1da177e4 344
1da177e4 345 current->flags |= PF_MEMALLOC;
b6b38f70 346 cFYI(1, "Demultiplex PID: %d", task_pid_nr(current));
93d0ec85
JL
347
348 length = atomic_inc_return(&tcpSesAllocCount);
349 if (length > 1)
26f57364
SF
350 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
351 GFP_KERNEL);
1da177e4 352
83144186 353 set_freezable();
469ee614 354 while (server->tcpStatus != CifsExiting) {
ede1327e
SF
355 if (try_to_freeze())
356 continue;
b8643e1b
SF
357 if (bigbuf == NULL) {
358 bigbuf = cifs_buf_get();
0fd1ffe0 359 if (!bigbuf) {
b6b38f70 360 cERROR(1, "No memory for large SMB response");
b8643e1b
SF
361 msleep(3000);
362 /* retry will check if exiting */
363 continue;
364 }
0fd1ffe0
PM
365 } else if (isLargeBuf) {
366 /* we are reusing a dirty large buf, clear its start */
26f57364 367 memset(bigbuf, 0, sizeof(struct smb_hdr));
1da177e4 368 }
b8643e1b
SF
369
370 if (smallbuf == NULL) {
371 smallbuf = cifs_small_buf_get();
0fd1ffe0 372 if (!smallbuf) {
b6b38f70 373 cERROR(1, "No memory for SMB response");
b8643e1b
SF
374 msleep(1000);
375 /* retry will check if exiting */
376 continue;
377 }
378 /* beginning of smb buffer is cleared in our buf_get */
379 } else /* if existing small buf clear beginning */
26f57364 380 memset(smallbuf, 0, sizeof(struct smb_hdr));
b8643e1b 381
4b18f2a9
SF
382 isLargeBuf = false;
383 isMultiRsp = false;
b8643e1b 384 smb_buffer = smallbuf;
1da177e4
LT
385 iov.iov_base = smb_buffer;
386 iov.iov_len = 4;
387 smb_msg.msg_control = NULL;
388 smb_msg.msg_controllen = 0;
f01d5e14
SF
389 pdu_length = 4; /* enough to get RFC1001 header */
390incomplete_rcv:
1da177e4
LT
391 length =
392 kernel_recvmsg(csocket, &smb_msg,
f01d5e14 393 &iov, 1, pdu_length, 0 /* BB other flags? */);
1da177e4 394
469ee614 395 if (server->tcpStatus == CifsExiting) {
1da177e4
LT
396 break;
397 } else if (server->tcpStatus == CifsNeedReconnect) {
b6b38f70 398 cFYI(1, "Reconnect after server stopped responding");
1da177e4 399 cifs_reconnect(server);
b6b38f70 400 cFYI(1, "call to reconnect done");
1da177e4
LT
401 csocket = server->ssocket;
402 continue;
522bbe65
JL
403 } else if (length == -ERESTARTSYS ||
404 length == -EAGAIN ||
405 length == -EINTR) {
b8643e1b 406 msleep(1); /* minimum sleep to prevent looping
1da177e4
LT
407 allowing socket to clear and app threads to set
408 tcpStatus CifsNeedReconnect if server hung */
c527c8a7
SF
409 if (pdu_length < 4) {
410 iov.iov_base = (4 - pdu_length) +
411 (char *)smb_buffer;
412 iov.iov_len = pdu_length;
413 smb_msg.msg_control = NULL;
414 smb_msg.msg_controllen = 0;
c18c732e 415 goto incomplete_rcv;
c527c8a7 416 } else
c18c732e 417 continue;
1da177e4 418 } else if (length <= 0) {
b6b38f70
JP
419 cFYI(1, "Reconnect after unexpected peek error %d",
420 length);
1da177e4
LT
421 cifs_reconnect(server);
422 csocket = server->ssocket;
423 wake_up(&server->response_q);
424 continue;
2a974680 425 } else if (length < pdu_length) {
b6b38f70
JP
426 cFYI(1, "requested %d bytes but only got %d bytes",
427 pdu_length, length);
f01d5e14 428 pdu_length -= length;
f01d5e14
SF
429 msleep(1);
430 goto incomplete_rcv;
46810cbf 431 }
1da177e4 432
70ca734a
SF
433 /* The right amount was read from socket - 4 bytes */
434 /* so we can now interpret the length field */
46810cbf 435
70ca734a
SF
436 /* the first byte big endian of the length field,
437 is actually not part of the length but the type
438 with the most common, zero, as regular data */
439 temp = *((char *) smb_buffer);
46810cbf 440
fb8c4b14 441 /* Note that FC 1001 length is big endian on the wire,
70ca734a
SF
442 but we convert it here so it is always manipulated
443 as host byte order */
5ca33c6a 444 pdu_length = be32_to_cpu((__force __be32)smb_buffer->smb_buf_length);
70ca734a
SF
445 smb_buffer->smb_buf_length = pdu_length;
446
b6b38f70 447 cFYI(1, "rfc1002 length 0x%x", pdu_length+4);
46810cbf 448
70ca734a 449 if (temp == (char) RFC1002_SESSION_KEEP_ALIVE) {
fb8c4b14 450 continue;
70ca734a 451 } else if (temp == (char)RFC1002_POSITIVE_SESSION_RESPONSE) {
b6b38f70 452 cFYI(1, "Good RFC 1002 session rsp");
e4eb295d 453 continue;
70ca734a 454 } else if (temp == (char)RFC1002_NEGATIVE_SESSION_RESPONSE) {
fb8c4b14 455 /* we get this from Windows 98 instead of
46810cbf 456 an error on SMB negprot response */
b6b38f70
JP
457 cFYI(1, "Negative RFC1002 Session Response Error 0x%x)",
458 pdu_length);
7332f2a6
JL
459 /* give server a second to clean up */
460 msleep(1000);
461 /* always try 445 first on reconnect since we get NACK
462 * on some if we ever connected to port 139 (the NACK
463 * is since we do not begin with RFC1001 session
464 * initialize frame)
465 */
32670396
JL
466 cifs_set_port((struct sockaddr *)
467 &server->addr.sockAddr, CIFS_PORT);
7332f2a6
JL
468 cifs_reconnect(server);
469 csocket = server->ssocket;
470 wake_up(&server->response_q);
471 continue;
70ca734a 472 } else if (temp != (char) 0) {
b6b38f70 473 cERROR(1, "Unknown RFC 1002 frame");
70ca734a
SF
474 cifs_dump_mem(" Received Data: ", (char *)smb_buffer,
475 length);
46810cbf
SF
476 cifs_reconnect(server);
477 csocket = server->ssocket;
478 continue;
e4eb295d
SF
479 }
480
481 /* else we have an SMB response */
fb8c4b14 482 if ((pdu_length > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) ||
26f57364 483 (pdu_length < sizeof(struct smb_hdr) - 1 - 4)) {
b6b38f70
JP
484 cERROR(1, "Invalid size SMB length %d pdu_length %d",
485 length, pdu_length+4);
e4eb295d
SF
486 cifs_reconnect(server);
487 csocket = server->ssocket;
488 wake_up(&server->response_q);
489 continue;
fb8c4b14 490 }
e4eb295d
SF
491
492 /* else length ok */
493 reconnect = 0;
494
fb8c4b14 495 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
4b18f2a9 496 isLargeBuf = true;
e4eb295d
SF
497 memcpy(bigbuf, smallbuf, 4);
498 smb_buffer = bigbuf;
499 }
500 length = 0;
501 iov.iov_base = 4 + (char *)smb_buffer;
502 iov.iov_len = pdu_length;
fb8c4b14 503 for (total_read = 0; total_read < pdu_length;
e4eb295d
SF
504 total_read += length) {
505 length = kernel_recvmsg(csocket, &smb_msg, &iov, 1,
506 pdu_length - total_read, 0);
522bbe65 507 if (server->tcpStatus == CifsExiting) {
e4eb295d
SF
508 /* then will exit */
509 reconnect = 2;
510 break;
511 } else if (server->tcpStatus == CifsNeedReconnect) {
46810cbf
SF
512 cifs_reconnect(server);
513 csocket = server->ssocket;
fb8c4b14 514 /* Reconnect wakes up rspns q */
e4eb295d
SF
515 /* Now we will reread sock */
516 reconnect = 1;
517 break;
522bbe65
JL
518 } else if (length == -ERESTARTSYS ||
519 length == -EAGAIN ||
520 length == -EINTR) {
e4eb295d 521 msleep(1); /* minimum sleep to prevent looping,
fb8c4b14 522 allowing socket to clear and app
e4eb295d
SF
523 threads to set tcpStatus
524 CifsNeedReconnect if server hung*/
c18c732e 525 length = 0;
46810cbf 526 continue;
e4eb295d 527 } else if (length <= 0) {
b6b38f70
JP
528 cERROR(1, "Received no data, expecting %d",
529 pdu_length - total_read);
e4eb295d
SF
530 cifs_reconnect(server);
531 csocket = server->ssocket;
532 reconnect = 1;
533 break;
46810cbf 534 }
e4eb295d 535 }
fb8c4b14 536 if (reconnect == 2)
e4eb295d 537 break;
fb8c4b14 538 else if (reconnect == 1)
e4eb295d 539 continue;
1da177e4 540
e4eb295d 541 length += 4; /* account for rfc1002 hdr */
50c2f753 542
09d1db5c 543
e4eb295d 544 dump_smb(smb_buffer, length);
184ed211 545 if (checkSMB(smb_buffer, smb_buffer->Mid, total_read+4)) {
b387eaeb 546 cifs_dump_mem("Bad SMB: ", smb_buffer, 48);
e4eb295d
SF
547 continue;
548 }
1da177e4 549
e4eb295d
SF
550
551 task_to_wake = NULL;
552 spin_lock(&GlobalMid_Lock);
553 list_for_each(tmp, &server->pending_mid_q) {
554 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
555
50c2f753 556 if ((mid_entry->mid == smb_buffer->Mid) &&
e4eb295d
SF
557 (mid_entry->midState == MID_REQUEST_SUBMITTED) &&
558 (mid_entry->command == smb_buffer->Command)) {
fb8c4b14 559 if (check2ndT2(smb_buffer,server->maxBuf) > 0) {
e4eb295d 560 /* We have a multipart transact2 resp */
4b18f2a9 561 isMultiRsp = true;
fb8c4b14 562 if (mid_entry->resp_buf) {
e4eb295d 563 /* merge response - fix up 1st*/
50c2f753 564 if (coalesce_t2(smb_buffer,
e4eb295d 565 mid_entry->resp_buf)) {
4b18f2a9
SF
566 mid_entry->multiRsp =
567 true;
e4eb295d
SF
568 break;
569 } else {
570 /* all parts received */
4b18f2a9
SF
571 mid_entry->multiEnd =
572 true;
50c2f753 573 goto multi_t2_fnd;
e4eb295d
SF
574 }
575 } else {
fb8c4b14 576 if (!isLargeBuf) {
b6b38f70 577 cERROR(1, "1st trans2 resp needs bigbuf");
e4eb295d 578 /* BB maybe we can fix this up, switch
50c2f753 579 to already allocated large buffer? */
e4eb295d 580 } else {
cd63499c 581 /* Have first buffer */
e4eb295d
SF
582 mid_entry->resp_buf =
583 smb_buffer;
4b18f2a9
SF
584 mid_entry->largeBuf =
585 true;
e4eb295d
SF
586 bigbuf = NULL;
587 }
588 }
589 break;
50c2f753 590 }
e4eb295d 591 mid_entry->resp_buf = smb_buffer;
4b18f2a9 592 mid_entry->largeBuf = isLargeBuf;
e4eb295d
SF
593multi_t2_fnd:
594 task_to_wake = mid_entry->tsk;
595 mid_entry->midState = MID_RESPONSE_RECEIVED;
1047abc1
SF
596#ifdef CONFIG_CIFS_STATS2
597 mid_entry->when_received = jiffies;
598#endif
3a5ff61c
SF
599 /* so we do not time out requests to server
600 which is still responding (since server could
601 be busy but not dead) */
602 server->lstrp = jiffies;
e4eb295d 603 break;
46810cbf 604 }
1da177e4 605 }
e4eb295d
SF
606 spin_unlock(&GlobalMid_Lock);
607 if (task_to_wake) {
cd63499c 608 /* Was previous buf put in mpx struct for multi-rsp? */
fb8c4b14 609 if (!isMultiRsp) {
cd63499c 610 /* smb buffer will be freed by user thread */
26f57364 611 if (isLargeBuf)
cd63499c 612 bigbuf = NULL;
26f57364 613 else
cd63499c
SF
614 smallbuf = NULL;
615 }
e4eb295d 616 wake_up_process(task_to_wake);
4b18f2a9
SF
617 } else if (!is_valid_oplock_break(smb_buffer, server) &&
618 !isMultiRsp) {
b6b38f70
JP
619 cERROR(1, "No task to wake, unknown frame received! "
620 "NumMids %d", midCount.counter);
50c2f753 621 cifs_dump_mem("Received Data is: ", (char *)smb_buffer,
70ca734a 622 sizeof(struct smb_hdr));
3979877e
SF
623#ifdef CONFIG_CIFS_DEBUG2
624 cifs_dump_detail(smb_buffer);
625 cifs_dump_mids(server);
626#endif /* CIFS_DEBUG2 */
50c2f753 627
e4eb295d
SF
628 }
629 } /* end while !EXITING */
630
e7ddee90
JL
631 /* take it off the list, if it's not already */
632 write_lock(&cifs_tcp_ses_lock);
633 list_del_init(&server->tcp_ses_list);
634 write_unlock(&cifs_tcp_ses_lock);
635
1da177e4
LT
636 spin_lock(&GlobalMid_Lock);
637 server->tcpStatus = CifsExiting;
e691b9d1 638 spin_unlock(&GlobalMid_Lock);
dbdbb876 639 wake_up_all(&server->response_q);
e691b9d1 640
31ca3bc3
SF
641 /* check if we have blocked requests that need to free */
642 /* Note that cifs_max_pending is normally 50, but
643 can be set at module install time to as little as two */
e691b9d1 644 spin_lock(&GlobalMid_Lock);
fb8c4b14 645 if (atomic_read(&server->inFlight) >= cifs_max_pending)
31ca3bc3
SF
646 atomic_set(&server->inFlight, cifs_max_pending - 1);
647 /* We do not want to set the max_pending too low or we
648 could end up with the counter going negative */
1da177e4 649 spin_unlock(&GlobalMid_Lock);
50c2f753 650 /* Although there should not be any requests blocked on
1da177e4 651 this queue it can not hurt to be paranoid and try to wake up requests
09d1db5c 652 that may haven been blocked when more than 50 at time were on the wire
1da177e4
LT
653 to the same server - they now will see the session is in exit state
654 and get out of SendReceive. */
655 wake_up_all(&server->request_q);
656 /* give those requests time to exit */
b8643e1b 657 msleep(125);
50c2f753 658
fb8c4b14 659 if (server->ssocket) {
1da177e4
LT
660 sock_release(csocket);
661 server->ssocket = NULL;
662 }
b8643e1b 663 /* buffer usuallly freed in free_mid - need to free it here on exit */
a8a11d39
MK
664 cifs_buf_release(bigbuf);
665 if (smallbuf) /* no sense logging a debug message if NULL */
b8643e1b 666 cifs_small_buf_release(smallbuf);
1da177e4 667
14fbf50d
JL
668 /*
669 * BB: we shouldn't have to do any of this. It shouldn't be
670 * possible to exit from the thread with active SMB sessions
671 */
672 read_lock(&cifs_tcp_ses_lock);
1da177e4 673 if (list_empty(&server->pending_mid_q)) {
09d1db5c
SF
674 /* loop through server session structures attached to this and
675 mark them dead */
14fbf50d
JL
676 list_for_each(tmp, &server->smb_ses_list) {
677 ses = list_entry(tmp, struct cifsSesInfo,
678 smb_ses_list);
679 ses->status = CifsExiting;
680 ses->server = NULL;
1da177e4 681 }
14fbf50d 682 read_unlock(&cifs_tcp_ses_lock);
1da177e4 683 } else {
31ca3bc3
SF
684 /* although we can not zero the server struct pointer yet,
685 since there are active requests which may depnd on them,
686 mark the corresponding SMB sessions as exiting too */
14fbf50d 687 list_for_each(tmp, &server->smb_ses_list) {
31ca3bc3 688 ses = list_entry(tmp, struct cifsSesInfo,
14fbf50d
JL
689 smb_ses_list);
690 ses->status = CifsExiting;
31ca3bc3
SF
691 }
692
1da177e4
LT
693 spin_lock(&GlobalMid_Lock);
694 list_for_each(tmp, &server->pending_mid_q) {
695 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
696 if (mid_entry->midState == MID_REQUEST_SUBMITTED) {
b6b38f70
JP
697 cFYI(1, "Clearing Mid 0x%x - waking up ",
698 mid_entry->mid);
1da177e4 699 task_to_wake = mid_entry->tsk;
26f57364 700 if (task_to_wake)
1da177e4 701 wake_up_process(task_to_wake);
1da177e4
LT
702 }
703 }
704 spin_unlock(&GlobalMid_Lock);
14fbf50d 705 read_unlock(&cifs_tcp_ses_lock);
1da177e4 706 /* 1/8th of sec is more than enough time for them to exit */
b8643e1b 707 msleep(125);
1da177e4
LT
708 }
709
f191401f 710 if (!list_empty(&server->pending_mid_q)) {
50c2f753 711 /* mpx threads have not exited yet give them
1da177e4 712 at least the smb send timeout time for long ops */
31ca3bc3
SF
713 /* due to delays on oplock break requests, we need
714 to wait at least 45 seconds before giving up
715 on a request getting a response and going ahead
716 and killing cifsd */
b6b38f70 717 cFYI(1, "Wait for exit from demultiplex thread");
31ca3bc3 718 msleep(46000);
1da177e4
LT
719 /* if threads still have not exited they are probably never
720 coming home not much else we can do but free the memory */
721 }
1da177e4 722
31ca3bc3
SF
723 /* last chance to mark ses pointers invalid
724 if there are any pointing to this (e.g
50c2f753 725 if a crazy root user tried to kill cifsd
31ca3bc3 726 kernel thread explicitly this might happen) */
14fbf50d
JL
727 /* BB: This shouldn't be necessary, see above */
728 read_lock(&cifs_tcp_ses_lock);
729 list_for_each(tmp, &server->smb_ses_list) {
730 ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list);
731 ses->server = NULL;
31ca3bc3 732 }
14fbf50d 733 read_unlock(&cifs_tcp_ses_lock);
31ca3bc3 734
c359cf3c 735 kfree(server->hostname);
b1c8d2b4 736 task_to_wake = xchg(&server->tsk, NULL);
31ca3bc3 737 kfree(server);
93d0ec85
JL
738
739 length = atomic_dec_return(&tcpSesAllocCount);
26f57364
SF
740 if (length > 0)
741 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
742 GFP_KERNEL);
50c2f753 743
b1c8d2b4
JL
744 /* if server->tsk was NULL then wait for a signal before exiting */
745 if (!task_to_wake) {
746 set_current_state(TASK_INTERRUPTIBLE);
747 while (!signal_pending(current)) {
748 schedule();
749 set_current_state(TASK_INTERRUPTIBLE);
750 }
751 set_current_state(TASK_RUNNING);
752 }
753
0468a2cf 754 module_put_and_exit(0);
1da177e4
LT
755}
756
c359cf3c
JL
757/* extract the host portion of the UNC string */
758static char *
759extract_hostname(const char *unc)
760{
761 const char *src;
762 char *dst, *delim;
763 unsigned int len;
764
765 /* skip double chars at beginning of string */
766 /* BB: check validity of these bytes? */
767 src = unc + 2;
768
769 /* delimiter between hostname and sharename is always '\\' now */
770 delim = strchr(src, '\\');
771 if (!delim)
772 return ERR_PTR(-EINVAL);
773
774 len = delim - src;
775 dst = kmalloc((len + 1), GFP_KERNEL);
776 if (dst == NULL)
777 return ERR_PTR(-ENOMEM);
778
779 memcpy(dst, src, len);
780 dst[len] = '\0';
781
782 return dst;
783}
784
1da177e4 785static int
50c2f753
SF
786cifs_parse_mount_options(char *options, const char *devname,
787 struct smb_vol *vol)
1da177e4
LT
788{
789 char *value;
790 char *data;
791 unsigned int temp_len, i, j;
792 char separator[2];
9b9d6b24
JL
793 short int override_uid = -1;
794 short int override_gid = -1;
795 bool uid_specified = false;
796 bool gid_specified = false;
1da177e4
LT
797
798 separator[0] = ',';
50c2f753 799 separator[1] = 0;
1da177e4 800
12e36b2f 801 if (Local_System_Name[0] != 0)
50c2f753 802 memcpy(vol->source_rfc1001_name, Local_System_Name, 15);
2cd646a2 803 else {
12e36b2f 804 char *nodename = utsname()->nodename;
50c2f753
SF
805 int n = strnlen(nodename, 15);
806 memset(vol->source_rfc1001_name, 0x20, 15);
807 for (i = 0; i < n; i++) {
2cd646a2
SF
808 /* does not have to be perfect mapping since field is
809 informational, only used for servers that do not support
810 port 445 and it can be overridden at mount time */
12e36b2f 811 vol->source_rfc1001_name[i] = toupper(nodename[i]);
2cd646a2 812 }
1da177e4
LT
813 }
814 vol->source_rfc1001_name[15] = 0;
a10faeb2
SF
815 /* null target name indicates to use *SMBSERVR default called name
816 if we end up sending RFC1001 session initialize */
817 vol->target_rfc1001_name[0] = 0;
3e4b3e1f
JL
818 vol->cred_uid = current_uid();
819 vol->linux_uid = current_uid();
a001e5b5 820 vol->linux_gid = current_gid();
f55ed1a8
JL
821
822 /* default to only allowing write access to owner of the mount */
823 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1da177e4
LT
824
825 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
ac67055e
JA
826 /* default is always to request posix paths. */
827 vol->posix_paths = 1;
a0c9217f
JL
828 /* default to using server inode numbers where available */
829 vol->server_ino = 1;
ac67055e 830
1da177e4
LT
831 if (!options)
832 return 1;
833
50c2f753 834 if (strncmp(options, "sep=", 4) == 0) {
fb8c4b14 835 if (options[4] != 0) {
1da177e4
LT
836 separator[0] = options[4];
837 options += 5;
838 } else {
b6b38f70 839 cFYI(1, "Null separator not allowed");
1da177e4
LT
840 }
841 }
50c2f753 842
1da177e4
LT
843 while ((data = strsep(&options, separator)) != NULL) {
844 if (!*data)
845 continue;
846 if ((value = strchr(data, '=')) != NULL)
847 *value++ = '\0';
848
50c2f753
SF
849 /* Have to parse this before we parse for "user" */
850 if (strnicmp(data, "user_xattr", 10) == 0) {
1da177e4 851 vol->no_xattr = 0;
50c2f753 852 } else if (strnicmp(data, "nouser_xattr", 12) == 0) {
1da177e4
LT
853 vol->no_xattr = 1;
854 } else if (strnicmp(data, "user", 4) == 0) {
4b952a9b 855 if (!value) {
1da177e4
LT
856 printk(KERN_WARNING
857 "CIFS: invalid or missing username\n");
858 return 1; /* needs_arg; */
fb8c4b14 859 } else if (!*value) {
4b952a9b
SF
860 /* null user, ie anonymous, authentication */
861 vol->nullauth = 1;
1da177e4
LT
862 }
863 if (strnlen(value, 200) < 200) {
864 vol->username = value;
865 } else {
866 printk(KERN_WARNING "CIFS: username too long\n");
867 return 1;
868 }
869 } else if (strnicmp(data, "pass", 4) == 0) {
870 if (!value) {
871 vol->password = NULL;
872 continue;
fb8c4b14 873 } else if (value[0] == 0) {
1da177e4
LT
874 /* check if string begins with double comma
875 since that would mean the password really
876 does start with a comma, and would not
877 indicate an empty string */
fb8c4b14 878 if (value[1] != separator[0]) {
1da177e4
LT
879 vol->password = NULL;
880 continue;
881 }
882 }
883 temp_len = strlen(value);
884 /* removed password length check, NTLM passwords
885 can be arbitrarily long */
886
50c2f753 887 /* if comma in password, the string will be
1da177e4
LT
888 prematurely null terminated. Commas in password are
889 specified across the cifs mount interface by a double
890 comma ie ,, and a comma used as in other cases ie ','
891 as a parameter delimiter/separator is single and due
892 to the strsep above is temporarily zeroed. */
893
894 /* NB: password legally can have multiple commas and
895 the only illegal character in a password is null */
896
50c2f753 897 if ((value[temp_len] == 0) &&
09d1db5c 898 (value[temp_len+1] == separator[0])) {
1da177e4
LT
899 /* reinsert comma */
900 value[temp_len] = separator[0];
50c2f753
SF
901 temp_len += 2; /* move after second comma */
902 while (value[temp_len] != 0) {
1da177e4 903 if (value[temp_len] == separator[0]) {
50c2f753 904 if (value[temp_len+1] ==
09d1db5c
SF
905 separator[0]) {
906 /* skip second comma */
907 temp_len++;
50c2f753 908 } else {
1da177e4
LT
909 /* single comma indicating start
910 of next parm */
911 break;
912 }
913 }
914 temp_len++;
915 }
fb8c4b14 916 if (value[temp_len] == 0) {
1da177e4
LT
917 options = NULL;
918 } else {
919 value[temp_len] = 0;
920 /* point option to start of next parm */
921 options = value + temp_len + 1;
922 }
50c2f753 923 /* go from value to value + temp_len condensing
1da177e4
LT
924 double commas to singles. Note that this ends up
925 allocating a few bytes too many, which is ok */
e915fc49 926 vol->password = kzalloc(temp_len, GFP_KERNEL);
fb8c4b14 927 if (vol->password == NULL) {
50c2f753
SF
928 printk(KERN_WARNING "CIFS: no memory "
929 "for password\n");
433dc24f
SF
930 return 1;
931 }
50c2f753 932 for (i = 0, j = 0; i < temp_len; i++, j++) {
1da177e4 933 vol->password[j] = value[i];
fb8c4b14 934 if (value[i] == separator[0]
09d1db5c 935 && value[i+1] == separator[0]) {
1da177e4
LT
936 /* skip second comma */
937 i++;
938 }
939 }
940 vol->password[j] = 0;
941 } else {
e915fc49 942 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
fb8c4b14 943 if (vol->password == NULL) {
50c2f753
SF
944 printk(KERN_WARNING "CIFS: no memory "
945 "for password\n");
433dc24f
SF
946 return 1;
947 }
1da177e4
LT
948 strcpy(vol->password, value);
949 }
58f7f68f
JL
950 } else if (!strnicmp(data, "ip", 2) ||
951 !strnicmp(data, "addr", 4)) {
1da177e4
LT
952 if (!value || !*value) {
953 vol->UNCip = NULL;
50b64e3b
JL
954 } else if (strnlen(value, INET6_ADDRSTRLEN) <
955 INET6_ADDRSTRLEN) {
1da177e4
LT
956 vol->UNCip = value;
957 } else {
50c2f753
SF
958 printk(KERN_WARNING "CIFS: ip address "
959 "too long\n");
1da177e4
LT
960 return 1;
961 }
50c2f753
SF
962 } else if (strnicmp(data, "sec", 3) == 0) {
963 if (!value || !*value) {
b6b38f70 964 cERROR(1, "no security value specified");
50c2f753
SF
965 continue;
966 } else if (strnicmp(value, "krb5i", 5) == 0) {
967 vol->secFlg |= CIFSSEC_MAY_KRB5 |
189acaae 968 CIFSSEC_MUST_SIGN;
bf820679 969 } else if (strnicmp(value, "krb5p", 5) == 0) {
50c2f753
SF
970 /* vol->secFlg |= CIFSSEC_MUST_SEAL |
971 CIFSSEC_MAY_KRB5; */
b6b38f70 972 cERROR(1, "Krb5 cifs privacy not supported");
bf820679
SF
973 return 1;
974 } else if (strnicmp(value, "krb5", 4) == 0) {
750d1151 975 vol->secFlg |= CIFSSEC_MAY_KRB5;
ac683924
SF
976#ifdef CONFIG_CIFS_EXPERIMENTAL
977 } else if (strnicmp(value, "ntlmsspi", 8) == 0) {
978 vol->secFlg |= CIFSSEC_MAY_NTLMSSP |
979 CIFSSEC_MUST_SIGN;
980 } else if (strnicmp(value, "ntlmssp", 7) == 0) {
981 vol->secFlg |= CIFSSEC_MAY_NTLMSSP;
982#endif
bf820679 983 } else if (strnicmp(value, "ntlmv2i", 7) == 0) {
750d1151 984 vol->secFlg |= CIFSSEC_MAY_NTLMV2 |
189acaae 985 CIFSSEC_MUST_SIGN;
bf820679 986 } else if (strnicmp(value, "ntlmv2", 6) == 0) {
750d1151 987 vol->secFlg |= CIFSSEC_MAY_NTLMV2;
bf820679 988 } else if (strnicmp(value, "ntlmi", 5) == 0) {
750d1151 989 vol->secFlg |= CIFSSEC_MAY_NTLM |
189acaae 990 CIFSSEC_MUST_SIGN;
bf820679
SF
991 } else if (strnicmp(value, "ntlm", 4) == 0) {
992 /* ntlm is default so can be turned off too */
750d1151 993 vol->secFlg |= CIFSSEC_MAY_NTLM;
bf820679 994 } else if (strnicmp(value, "nontlm", 6) == 0) {
189acaae 995 /* BB is there a better way to do this? */
750d1151 996 vol->secFlg |= CIFSSEC_MAY_NTLMV2;
189acaae
SF
997#ifdef CONFIG_CIFS_WEAK_PW_HASH
998 } else if (strnicmp(value, "lanman", 6) == 0) {
50c2f753 999 vol->secFlg |= CIFSSEC_MAY_LANMAN;
189acaae 1000#endif
bf820679 1001 } else if (strnicmp(value, "none", 4) == 0) {
189acaae 1002 vol->nullauth = 1;
50c2f753 1003 } else {
b6b38f70 1004 cERROR(1, "bad security option: %s", value);
50c2f753
SF
1005 return 1;
1006 }
1da177e4
LT
1007 } else if ((strnicmp(data, "unc", 3) == 0)
1008 || (strnicmp(data, "target", 6) == 0)
1009 || (strnicmp(data, "path", 4) == 0)) {
1010 if (!value || !*value) {
50c2f753
SF
1011 printk(KERN_WARNING "CIFS: invalid path to "
1012 "network resource\n");
1da177e4
LT
1013 return 1; /* needs_arg; */
1014 }
1015 if ((temp_len = strnlen(value, 300)) < 300) {
50c2f753 1016 vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
4523cc30 1017 if (vol->UNC == NULL)
1da177e4 1018 return 1;
50c2f753 1019 strcpy(vol->UNC, value);
1da177e4
LT
1020 if (strncmp(vol->UNC, "//", 2) == 0) {
1021 vol->UNC[0] = '\\';
1022 vol->UNC[1] = '\\';
50c2f753 1023 } else if (strncmp(vol->UNC, "\\\\", 2) != 0) {
1da177e4 1024 printk(KERN_WARNING
50c2f753
SF
1025 "CIFS: UNC Path does not begin "
1026 "with // or \\\\ \n");
1da177e4
LT
1027 return 1;
1028 }
1029 } else {
1030 printk(KERN_WARNING "CIFS: UNC name too long\n");
1031 return 1;
1032 }
1033 } else if ((strnicmp(data, "domain", 3) == 0)
1034 || (strnicmp(data, "workgroup", 5) == 0)) {
1035 if (!value || !*value) {
1036 printk(KERN_WARNING "CIFS: invalid domain name\n");
1037 return 1; /* needs_arg; */
1038 }
1039 /* BB are there cases in which a comma can be valid in
1040 a domain name and need special handling? */
3979877e 1041 if (strnlen(value, 256) < 256) {
1da177e4 1042 vol->domainname = value;
b6b38f70 1043 cFYI(1, "Domain name set");
1da177e4 1044 } else {
50c2f753
SF
1045 printk(KERN_WARNING "CIFS: domain name too "
1046 "long\n");
1da177e4
LT
1047 return 1;
1048 }
50c2f753
SF
1049 } else if (strnicmp(data, "prefixpath", 10) == 0) {
1050 if (!value || !*value) {
1051 printk(KERN_WARNING
1052 "CIFS: invalid path prefix\n");
1053 return 1; /* needs_argument */
1054 }
1055 if ((temp_len = strnlen(value, 1024)) < 1024) {
4523cc30 1056 if (value[0] != '/')
2fe87f02 1057 temp_len++; /* missing leading slash */
50c2f753
SF
1058 vol->prepath = kmalloc(temp_len+1, GFP_KERNEL);
1059 if (vol->prepath == NULL)
1060 return 1;
4523cc30 1061 if (value[0] != '/') {
2fe87f02 1062 vol->prepath[0] = '/';
50c2f753 1063 strcpy(vol->prepath+1, value);
2fe87f02 1064 } else
50c2f753 1065 strcpy(vol->prepath, value);
b6b38f70 1066 cFYI(1, "prefix path %s", vol->prepath);
50c2f753
SF
1067 } else {
1068 printk(KERN_WARNING "CIFS: prefix too long\n");
1069 return 1;
1070 }
1da177e4
LT
1071 } else if (strnicmp(data, "iocharset", 9) == 0) {
1072 if (!value || !*value) {
63135e08
SF
1073 printk(KERN_WARNING "CIFS: invalid iocharset "
1074 "specified\n");
1da177e4
LT
1075 return 1; /* needs_arg; */
1076 }
1077 if (strnlen(value, 65) < 65) {
50c2f753 1078 if (strnicmp(value, "default", 7))
1da177e4 1079 vol->iocharset = value;
50c2f753
SF
1080 /* if iocharset not set then load_nls_default
1081 is used by caller */
b6b38f70 1082 cFYI(1, "iocharset set to %s", value);
1da177e4 1083 } else {
63135e08
SF
1084 printk(KERN_WARNING "CIFS: iocharset name "
1085 "too long.\n");
1da177e4
LT
1086 return 1;
1087 }
9b9d6b24
JL
1088 } else if (!strnicmp(data, "uid", 3) && value && *value) {
1089 vol->linux_uid = simple_strtoul(value, &value, 0);
1090 uid_specified = true;
1091 } else if (!strnicmp(data, "forceuid", 8)) {
1092 override_uid = 1;
1093 } else if (!strnicmp(data, "noforceuid", 10)) {
1094 override_uid = 0;
1095 } else if (!strnicmp(data, "gid", 3) && value && *value) {
1096 vol->linux_gid = simple_strtoul(value, &value, 0);
1097 gid_specified = true;
1098 } else if (!strnicmp(data, "forcegid", 8)) {
1099 override_gid = 1;
1100 } else if (!strnicmp(data, "noforcegid", 10)) {
1101 override_gid = 0;
1da177e4
LT
1102 } else if (strnicmp(data, "file_mode", 4) == 0) {
1103 if (value && *value) {
1104 vol->file_mode =
1105 simple_strtoul(value, &value, 0);
1106 }
1107 } else if (strnicmp(data, "dir_mode", 4) == 0) {
1108 if (value && *value) {
1109 vol->dir_mode =
1110 simple_strtoul(value, &value, 0);
1111 }
1112 } else if (strnicmp(data, "dirmode", 4) == 0) {
1113 if (value && *value) {
1114 vol->dir_mode =
1115 simple_strtoul(value, &value, 0);
1116 }
1117 } else if (strnicmp(data, "port", 4) == 0) {
1118 if (value && *value) {
1119 vol->port =
1120 simple_strtoul(value, &value, 0);
1121 }
1122 } else if (strnicmp(data, "rsize", 5) == 0) {
1123 if (value && *value) {
1124 vol->rsize =
1125 simple_strtoul(value, &value, 0);
1126 }
1127 } else if (strnicmp(data, "wsize", 5) == 0) {
1128 if (value && *value) {
1129 vol->wsize =
1130 simple_strtoul(value, &value, 0);
1131 }
1132 } else if (strnicmp(data, "sockopt", 5) == 0) {
6a5fa236 1133 if (!value || !*value) {
b6b38f70 1134 cERROR(1, "no socket option specified");
6a5fa236
SF
1135 continue;
1136 } else if (strnicmp(value, "TCP_NODELAY", 11) == 0) {
1137 vol->sockopt_tcp_nodelay = 1;
1da177e4
LT
1138 }
1139 } else if (strnicmp(data, "netbiosname", 4) == 0) {
1140 if (!value || !*value || (*value == ' ')) {
b6b38f70 1141 cFYI(1, "invalid (empty) netbiosname");
1da177e4 1142 } else {
50c2f753
SF
1143 memset(vol->source_rfc1001_name, 0x20, 15);
1144 for (i = 0; i < 15; i++) {
1145 /* BB are there cases in which a comma can be
1da177e4
LT
1146 valid in this workstation netbios name (and need
1147 special handling)? */
1148
1149 /* We do not uppercase netbiosname for user */
50c2f753 1150 if (value[i] == 0)
1da177e4 1151 break;
50c2f753
SF
1152 else
1153 vol->source_rfc1001_name[i] =
1154 value[i];
1da177e4
LT
1155 }
1156 /* The string has 16th byte zero still from
1157 set at top of the function */
50c2f753
SF
1158 if ((i == 15) && (value[i] != 0))
1159 printk(KERN_WARNING "CIFS: netbiosname"
1160 " longer than 15 truncated.\n");
a10faeb2
SF
1161 }
1162 } else if (strnicmp(data, "servern", 7) == 0) {
1163 /* servernetbiosname specified override *SMBSERVER */
1164 if (!value || !*value || (*value == ' ')) {
b6b38f70 1165 cFYI(1, "empty server netbiosname specified");
a10faeb2
SF
1166 } else {
1167 /* last byte, type, is 0x20 for servr type */
50c2f753 1168 memset(vol->target_rfc1001_name, 0x20, 16);
a10faeb2 1169
50c2f753 1170 for (i = 0; i < 15; i++) {
a10faeb2 1171 /* BB are there cases in which a comma can be
50c2f753
SF
1172 valid in this workstation netbios name
1173 (and need special handling)? */
a10faeb2 1174
50c2f753
SF
1175 /* user or mount helper must uppercase
1176 the netbiosname */
1177 if (value[i] == 0)
a10faeb2
SF
1178 break;
1179 else
50c2f753
SF
1180 vol->target_rfc1001_name[i] =
1181 value[i];
a10faeb2
SF
1182 }
1183 /* The string has 16th byte zero still from
1184 set at top of the function */
50c2f753
SF
1185 if ((i == 15) && (value[i] != 0))
1186 printk(KERN_WARNING "CIFS: server net"
1187 "biosname longer than 15 truncated.\n");
1da177e4
LT
1188 }
1189 } else if (strnicmp(data, "credentials", 4) == 0) {
1190 /* ignore */
1191 } else if (strnicmp(data, "version", 3) == 0) {
1192 /* ignore */
50c2f753 1193 } else if (strnicmp(data, "guest", 5) == 0) {
1da177e4 1194 /* ignore */
71a394fa
SF
1195 } else if (strnicmp(data, "rw", 2) == 0) {
1196 /* ignore */
1197 } else if (strnicmp(data, "ro", 2) == 0) {
1198 /* ignore */
edf1ae40
SF
1199 } else if (strnicmp(data, "noblocksend", 11) == 0) {
1200 vol->noblocksnd = 1;
1201 } else if (strnicmp(data, "noautotune", 10) == 0) {
1202 vol->noautotune = 1;
1da177e4
LT
1203 } else if ((strnicmp(data, "suid", 4) == 0) ||
1204 (strnicmp(data, "nosuid", 6) == 0) ||
1205 (strnicmp(data, "exec", 4) == 0) ||
1206 (strnicmp(data, "noexec", 6) == 0) ||
1207 (strnicmp(data, "nodev", 5) == 0) ||
1208 (strnicmp(data, "noauto", 6) == 0) ||
1209 (strnicmp(data, "dev", 3) == 0)) {
1210 /* The mount tool or mount.cifs helper (if present)
50c2f753
SF
1211 uses these opts to set flags, and the flags are read
1212 by the kernel vfs layer before we get here (ie
1213 before read super) so there is no point trying to
1214 parse these options again and set anything and it
1215 is ok to just ignore them */
1da177e4 1216 continue;
1da177e4
LT
1217 } else if (strnicmp(data, "hard", 4) == 0) {
1218 vol->retry = 1;
1219 } else if (strnicmp(data, "soft", 4) == 0) {
1220 vol->retry = 0;
1221 } else if (strnicmp(data, "perm", 4) == 0) {
1222 vol->noperm = 0;
1223 } else if (strnicmp(data, "noperm", 6) == 0) {
1224 vol->noperm = 1;
6a0b4824
SF
1225 } else if (strnicmp(data, "mapchars", 8) == 0) {
1226 vol->remap = 1;
1227 } else if (strnicmp(data, "nomapchars", 10) == 0) {
1228 vol->remap = 0;
50c2f753
SF
1229 } else if (strnicmp(data, "sfu", 3) == 0) {
1230 vol->sfu_emul = 1;
1231 } else if (strnicmp(data, "nosfu", 5) == 0) {
1232 vol->sfu_emul = 0;
2c1b8615
SF
1233 } else if (strnicmp(data, "nodfs", 5) == 0) {
1234 vol->nodfs = 1;
ac67055e
JA
1235 } else if (strnicmp(data, "posixpaths", 10) == 0) {
1236 vol->posix_paths = 1;
1237 } else if (strnicmp(data, "noposixpaths", 12) == 0) {
1238 vol->posix_paths = 0;
c18c842b
SF
1239 } else if (strnicmp(data, "nounix", 6) == 0) {
1240 vol->no_linux_ext = 1;
1241 } else if (strnicmp(data, "nolinux", 7) == 0) {
1242 vol->no_linux_ext = 1;
50c2f753 1243 } else if ((strnicmp(data, "nocase", 6) == 0) ||
a10faeb2 1244 (strnicmp(data, "ignorecase", 10) == 0)) {
50c2f753 1245 vol->nocase = 1;
f636a348
JL
1246 } else if (strnicmp(data, "mand", 4) == 0) {
1247 /* ignore */
1248 } else if (strnicmp(data, "nomand", 6) == 0) {
1249 /* ignore */
1250 } else if (strnicmp(data, "_netdev", 7) == 0) {
1251 /* ignore */
c46fa8ac
SF
1252 } else if (strnicmp(data, "brl", 3) == 0) {
1253 vol->nobrl = 0;
50c2f753 1254 } else if ((strnicmp(data, "nobrl", 5) == 0) ||
1c955187 1255 (strnicmp(data, "nolock", 6) == 0)) {
c46fa8ac 1256 vol->nobrl = 1;
d3485d37
SF
1257 /* turn off mandatory locking in mode
1258 if remote locking is turned off since the
1259 local vfs will do advisory */
50c2f753
SF
1260 if (vol->file_mode ==
1261 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
d3485d37 1262 vol->file_mode = S_IALLUGO;
13a6e42a
SF
1263 } else if (strnicmp(data, "forcemandatorylock", 9) == 0) {
1264 /* will take the shorter form "forcemand" as well */
1265 /* This mount option will force use of mandatory
1266 (DOS/Windows style) byte range locks, instead of
1267 using posix advisory byte range locks, even if the
1268 Unix extensions are available and posix locks would
1269 be supported otherwise. If Unix extensions are not
1270 negotiated this has no effect since mandatory locks
1271 would be used (mandatory locks is all that those
1272 those servers support) */
1273 vol->mand_lock = 1;
1da177e4
LT
1274 } else if (strnicmp(data, "setuids", 7) == 0) {
1275 vol->setuids = 1;
1276 } else if (strnicmp(data, "nosetuids", 9) == 0) {
1277 vol->setuids = 0;
d0a9c078
JL
1278 } else if (strnicmp(data, "dynperm", 7) == 0) {
1279 vol->dynperm = true;
1280 } else if (strnicmp(data, "nodynperm", 9) == 0) {
1281 vol->dynperm = false;
1da177e4
LT
1282 } else if (strnicmp(data, "nohard", 6) == 0) {
1283 vol->retry = 0;
1284 } else if (strnicmp(data, "nosoft", 6) == 0) {
1285 vol->retry = 1;
1286 } else if (strnicmp(data, "nointr", 6) == 0) {
1287 vol->intr = 0;
1288 } else if (strnicmp(data, "intr", 4) == 0) {
1289 vol->intr = 1;
be652445
SF
1290 } else if (strnicmp(data, "nostrictsync", 12) == 0) {
1291 vol->nostrictsync = 1;
1292 } else if (strnicmp(data, "strictsync", 10) == 0) {
1293 vol->nostrictsync = 0;
50c2f753 1294 } else if (strnicmp(data, "serverino", 7) == 0) {
1da177e4 1295 vol->server_ino = 1;
50c2f753 1296 } else if (strnicmp(data, "noserverino", 9) == 0) {
1da177e4 1297 vol->server_ino = 0;
50c2f753 1298 } else if (strnicmp(data, "cifsacl", 7) == 0) {
0a4b92c0
SF
1299 vol->cifs_acl = 1;
1300 } else if (strnicmp(data, "nocifsacl", 9) == 0) {
1301 vol->cifs_acl = 0;
50c2f753 1302 } else if (strnicmp(data, "acl", 3) == 0) {
1da177e4 1303 vol->no_psx_acl = 0;
50c2f753 1304 } else if (strnicmp(data, "noacl", 5) == 0) {
1da177e4 1305 vol->no_psx_acl = 1;
84210e91
SF
1306#ifdef CONFIG_CIFS_EXPERIMENTAL
1307 } else if (strnicmp(data, "locallease", 6) == 0) {
1308 vol->local_lease = 1;
1309#endif
50c2f753 1310 } else if (strnicmp(data, "sign", 4) == 0) {
750d1151 1311 vol->secFlg |= CIFSSEC_MUST_SIGN;
95b1cb90
SF
1312 } else if (strnicmp(data, "seal", 4) == 0) {
1313 /* we do not do the following in secFlags because seal
1314 is a per tree connection (mount) not a per socket
1315 or per-smb connection option in the protocol */
1316 /* vol->secFlg |= CIFSSEC_MUST_SEAL; */
1317 vol->seal = 1;
50c2f753 1318 } else if (strnicmp(data, "direct", 6) == 0) {
1da177e4 1319 vol->direct_io = 1;
50c2f753 1320 } else if (strnicmp(data, "forcedirectio", 13) == 0) {
1da177e4 1321 vol->direct_io = 1;
1da177e4 1322 } else if (strnicmp(data, "noac", 4) == 0) {
50c2f753
SF
1323 printk(KERN_WARNING "CIFS: Mount option noac not "
1324 "supported. Instead set "
1325 "/proc/fs/cifs/LookupCacheEnabled to 0\n");
fa1df75d
SJ
1326 } else if (strnicmp(data, "fsc", 3) == 0) {
1327 vol->fsc = true;
1da177e4 1328 } else
50c2f753
SF
1329 printk(KERN_WARNING "CIFS: Unknown mount option %s\n",
1330 data);
1da177e4
LT
1331 }
1332 if (vol->UNC == NULL) {
4523cc30 1333 if (devname == NULL) {
50c2f753
SF
1334 printk(KERN_WARNING "CIFS: Missing UNC name for mount "
1335 "target\n");
1da177e4
LT
1336 return 1;
1337 }
1338 if ((temp_len = strnlen(devname, 300)) < 300) {
50c2f753 1339 vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
4523cc30 1340 if (vol->UNC == NULL)
1da177e4 1341 return 1;
50c2f753 1342 strcpy(vol->UNC, devname);
1da177e4
LT
1343 if (strncmp(vol->UNC, "//", 2) == 0) {
1344 vol->UNC[0] = '\\';
1345 vol->UNC[1] = '\\';
1346 } else if (strncmp(vol->UNC, "\\\\", 2) != 0) {
50c2f753
SF
1347 printk(KERN_WARNING "CIFS: UNC Path does not "
1348 "begin with // or \\\\ \n");
1da177e4
LT
1349 return 1;
1350 }
7c5e628f
IM
1351 value = strpbrk(vol->UNC+2, "/\\");
1352 if (value)
1353 *value = '\\';
1da177e4
LT
1354 } else {
1355 printk(KERN_WARNING "CIFS: UNC name too long\n");
1356 return 1;
1357 }
1358 }
fb8c4b14 1359 if (vol->UNCip == NULL)
1da177e4
LT
1360 vol->UNCip = &vol->UNC[2];
1361
9b9d6b24
JL
1362 if (uid_specified)
1363 vol->override_uid = override_uid;
1364 else if (override_uid == 1)
1365 printk(KERN_NOTICE "CIFS: ignoring forceuid mount option "
1366 "specified with no uid= option.\n");
1367
1368 if (gid_specified)
1369 vol->override_gid = override_gid;
1370 else if (override_gid == 1)
1371 printk(KERN_NOTICE "CIFS: ignoring forcegid mount option "
1372 "specified with no gid= option.\n");
1373
1da177e4
LT
1374 return 0;
1375}
1376
4515148e
JL
1377static bool
1378match_address(struct TCP_Server_Info *server, struct sockaddr *addr)
1379{
1380 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1381 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1382
1383 switch (addr->sa_family) {
1384 case AF_INET:
1385 if (addr4->sin_addr.s_addr !=
1386 server->addr.sockAddr.sin_addr.s_addr)
1387 return false;
1388 if (addr4->sin_port &&
1389 addr4->sin_port != server->addr.sockAddr.sin_port)
1390 return false;
1391 break;
1392 case AF_INET6:
1393 if (!ipv6_addr_equal(&addr6->sin6_addr,
1394 &server->addr.sockAddr6.sin6_addr))
1395 return false;
1396 if (addr6->sin6_scope_id !=
1397 server->addr.sockAddr6.sin6_scope_id)
1398 return false;
1399 if (addr6->sin6_port &&
1400 addr6->sin6_port != server->addr.sockAddr6.sin6_port)
1401 return false;
1402 break;
1403 }
1404
1405 return true;
1406}
1407
daf5b0b6
JL
1408static bool
1409match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
1410{
1411 unsigned int secFlags;
1412
1413 if (vol->secFlg & (~(CIFSSEC_MUST_SIGN | CIFSSEC_MUST_SEAL)))
1414 secFlags = vol->secFlg;
1415 else
1416 secFlags = global_secflags | vol->secFlg;
1417
1418 switch (server->secType) {
1419 case LANMAN:
1420 if (!(secFlags & (CIFSSEC_MAY_LANMAN|CIFSSEC_MAY_PLNTXT)))
1421 return false;
1422 break;
1423 case NTLMv2:
1424 if (!(secFlags & CIFSSEC_MAY_NTLMV2))
1425 return false;
1426 break;
1427 case NTLM:
1428 if (!(secFlags & CIFSSEC_MAY_NTLM))
1429 return false;
1430 break;
1431 case Kerberos:
1432 if (!(secFlags & CIFSSEC_MAY_KRB5))
1433 return false;
1434 break;
1435 case RawNTLMSSP:
1436 if (!(secFlags & CIFSSEC_MAY_NTLMSSP))
1437 return false;
1438 break;
1439 default:
1440 /* shouldn't happen */
1441 return false;
1442 }
1443
1444 /* now check if signing mode is acceptible */
1445 if ((secFlags & CIFSSEC_MAY_SIGN) == 0 &&
1446 (server->secMode & SECMODE_SIGN_REQUIRED))
1447 return false;
1448 else if (((secFlags & CIFSSEC_MUST_SIGN) == CIFSSEC_MUST_SIGN) &&
1449 (server->secMode &
1450 (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED)) == 0)
1451 return false;
1452
1453 return true;
1454}
1455
e7ddee90 1456static struct TCP_Server_Info *
daf5b0b6 1457cifs_find_tcp_session(struct sockaddr *addr, struct smb_vol *vol)
1da177e4 1458{
e7ddee90 1459 struct TCP_Server_Info *server;
e7ddee90
JL
1460
1461 write_lock(&cifs_tcp_ses_lock);
4515148e 1462 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
e7ddee90
JL
1463 /*
1464 * the demux thread can exit on its own while still in CifsNew
1465 * so don't accept any sockets in that state. Since the
1466 * tcpStatus never changes back to CifsNew it's safe to check
1467 * for this without a lock.
1468 */
1469 if (server->tcpStatus == CifsNew)
1b20d672 1470 continue;
1da177e4 1471
4515148e
JL
1472 if (!match_address(server, addr))
1473 continue;
1b20d672 1474
daf5b0b6
JL
1475 if (!match_security(server, vol))
1476 continue;
1477
e7ddee90
JL
1478 ++server->srv_count;
1479 write_unlock(&cifs_tcp_ses_lock);
b6b38f70 1480 cFYI(1, "Existing tcp session with server found");
e7ddee90 1481 return server;
1da177e4 1482 }
e7ddee90 1483 write_unlock(&cifs_tcp_ses_lock);
1da177e4
LT
1484 return NULL;
1485}
1b20d672 1486
14fbf50d 1487static void
e7ddee90 1488cifs_put_tcp_session(struct TCP_Server_Info *server)
1da177e4 1489{
e7ddee90 1490 struct task_struct *task;
1b20d672 1491
e7ddee90
JL
1492 write_lock(&cifs_tcp_ses_lock);
1493 if (--server->srv_count > 0) {
1494 write_unlock(&cifs_tcp_ses_lock);
1495 return;
1da177e4 1496 }
1b20d672 1497
e7ddee90
JL
1498 list_del_init(&server->tcp_ses_list);
1499 write_unlock(&cifs_tcp_ses_lock);
dea570e0 1500
e7ddee90
JL
1501 spin_lock(&GlobalMid_Lock);
1502 server->tcpStatus = CifsExiting;
1503 spin_unlock(&GlobalMid_Lock);
dea570e0 1504
488f1d2d
SJ
1505 cifs_fscache_release_client_cookie(server);
1506
e7ddee90
JL
1507 task = xchg(&server->tsk, NULL);
1508 if (task)
1509 force_sig(SIGKILL, task);
1da177e4
LT
1510}
1511
63c038c2
JL
1512static struct TCP_Server_Info *
1513cifs_get_tcp_session(struct smb_vol *volume_info)
1514{
1515 struct TCP_Server_Info *tcp_ses = NULL;
a9ac49d3 1516 struct sockaddr_storage addr;
63c038c2
JL
1517 struct sockaddr_in *sin_server = (struct sockaddr_in *) &addr;
1518 struct sockaddr_in6 *sin_server6 = (struct sockaddr_in6 *) &addr;
1519 int rc;
1520
a9ac49d3 1521 memset(&addr, 0, sizeof(struct sockaddr_storage));
63c038c2 1522
b6b38f70 1523 cFYI(1, "UNC: %s ip: %s", volume_info->UNC, volume_info->UNCip);
63c038c2 1524
1e68b2b2 1525 if (volume_info->UNCip && volume_info->UNC) {
50d97160
JL
1526 rc = cifs_fill_sockaddr((struct sockaddr *)&addr,
1527 volume_info->UNCip,
67b7626a 1528 strlen(volume_info->UNCip),
50d97160 1529 volume_info->port);
1e68b2b2 1530 if (!rc) {
63c038c2
JL
1531 /* we failed translating address */
1532 rc = -EINVAL;
1533 goto out_err;
1534 }
63c038c2
JL
1535 } else if (volume_info->UNCip) {
1536 /* BB using ip addr as tcp_ses name to connect to the
1537 DFS root below */
b6b38f70 1538 cERROR(1, "Connecting to DFS root not implemented yet");
63c038c2
JL
1539 rc = -EINVAL;
1540 goto out_err;
1541 } else /* which tcp_sess DFS root would we conect to */ {
b6b38f70
JP
1542 cERROR(1, "CIFS mount error: No UNC path (e.g. -o "
1543 "unc=//192.168.1.100/public) specified");
63c038c2
JL
1544 rc = -EINVAL;
1545 goto out_err;
1546 }
1547
1548 /* see if we already have a matching tcp_ses */
daf5b0b6 1549 tcp_ses = cifs_find_tcp_session((struct sockaddr *)&addr, volume_info);
63c038c2
JL
1550 if (tcp_ses)
1551 return tcp_ses;
1552
1553 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
1554 if (!tcp_ses) {
1555 rc = -ENOMEM;
1556 goto out_err;
1557 }
1558
1559 tcp_ses->hostname = extract_hostname(volume_info->UNC);
1560 if (IS_ERR(tcp_ses->hostname)) {
1561 rc = PTR_ERR(tcp_ses->hostname);
1562 goto out_err;
1563 }
1564
1565 tcp_ses->noblocksnd = volume_info->noblocksnd;
1566 tcp_ses->noautotune = volume_info->noautotune;
6a5fa236 1567 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
63c038c2
JL
1568 atomic_set(&tcp_ses->inFlight, 0);
1569 init_waitqueue_head(&tcp_ses->response_q);
1570 init_waitqueue_head(&tcp_ses->request_q);
1571 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
1572 mutex_init(&tcp_ses->srv_mutex);
1573 memcpy(tcp_ses->workstation_RFC1001_name,
1574 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1575 memcpy(tcp_ses->server_RFC1001_name,
1576 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1577 tcp_ses->sequence_number = 0;
1578 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
1579 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
1580
1581 /*
1582 * at this point we are the only ones with the pointer
1583 * to the struct since the kernel thread not created yet
1584 * no need to spinlock this init of tcpStatus or srv_count
1585 */
1586 tcp_ses->tcpStatus = CifsNew;
1587 ++tcp_ses->srv_count;
1588
a9ac49d3 1589 if (addr.ss_family == AF_INET6) {
b6b38f70 1590 cFYI(1, "attempting ipv6 connect");
63c038c2
JL
1591 /* BB should we allow ipv6 on port 139? */
1592 /* other OS never observed in Wild doing 139 with v6 */
1593 memcpy(&tcp_ses->addr.sockAddr6, sin_server6,
1594 sizeof(struct sockaddr_in6));
d5c5605c 1595 rc = ipv6_connect(tcp_ses);
63c038c2
JL
1596 } else {
1597 memcpy(&tcp_ses->addr.sockAddr, sin_server,
1598 sizeof(struct sockaddr_in));
bcf4b106 1599 rc = ipv4_connect(tcp_ses);
63c038c2
JL
1600 }
1601 if (rc < 0) {
b6b38f70 1602 cERROR(1, "Error connecting to socket. Aborting operation");
63c038c2
JL
1603 goto out_err;
1604 }
1605
1606 /*
1607 * since we're in a cifs function already, we know that
1608 * this will succeed. No need for try_module_get().
1609 */
1610 __module_get(THIS_MODULE);
1611 tcp_ses->tsk = kthread_run((void *)(void *)cifs_demultiplex_thread,
1612 tcp_ses, "cifsd");
1613 if (IS_ERR(tcp_ses->tsk)) {
1614 rc = PTR_ERR(tcp_ses->tsk);
b6b38f70 1615 cERROR(1, "error %d create cifsd thread", rc);
63c038c2
JL
1616 module_put(THIS_MODULE);
1617 goto out_err;
1618 }
1619
1620 /* thread spawned, put it on the list */
1621 write_lock(&cifs_tcp_ses_lock);
1622 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
1623 write_unlock(&cifs_tcp_ses_lock);
1624
488f1d2d
SJ
1625 cifs_fscache_get_client_cookie(tcp_ses);
1626
63c038c2
JL
1627 return tcp_ses;
1628
1629out_err:
1630 if (tcp_ses) {
8347a5cd
SF
1631 if (!IS_ERR(tcp_ses->hostname))
1632 kfree(tcp_ses->hostname);
63c038c2
JL
1633 if (tcp_ses->ssocket)
1634 sock_release(tcp_ses->ssocket);
1635 kfree(tcp_ses);
1636 }
1637 return ERR_PTR(rc);
1638}
1639
14fbf50d 1640static struct cifsSesInfo *
4ff67b72 1641cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
1da177e4 1642{
14fbf50d 1643 struct cifsSesInfo *ses;
dea570e0 1644
14fbf50d 1645 write_lock(&cifs_tcp_ses_lock);
4ff67b72
JL
1646 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
1647 switch (server->secType) {
1648 case Kerberos:
3e4b3e1f 1649 if (vol->cred_uid != ses->cred_uid)
4ff67b72
JL
1650 continue;
1651 break;
1652 default:
1653 /* anything else takes username/password */
1654 if (strncmp(ses->userName, vol->username,
1655 MAX_USERNAME_SIZE))
1656 continue;
1657 if (strlen(vol->username) != 0 &&
24e6cf92 1658 ses->password != NULL &&
fc87a406
JL
1659 strncmp(ses->password,
1660 vol->password ? vol->password : "",
4ff67b72
JL
1661 MAX_PASSWORD_SIZE))
1662 continue;
1663 }
14fbf50d
JL
1664 ++ses->ses_count;
1665 write_unlock(&cifs_tcp_ses_lock);
1666 return ses;
1667 }
1668 write_unlock(&cifs_tcp_ses_lock);
1669 return NULL;
1670}
dea570e0 1671
14fbf50d
JL
1672static void
1673cifs_put_smb_ses(struct cifsSesInfo *ses)
1674{
1675 int xid;
1676 struct TCP_Server_Info *server = ses->server;
dea570e0 1677
36988c76 1678 cFYI(1, "%s: ses_count=%d\n", __func__, ses->ses_count);
14fbf50d
JL
1679 write_lock(&cifs_tcp_ses_lock);
1680 if (--ses->ses_count > 0) {
1681 write_unlock(&cifs_tcp_ses_lock);
1682 return;
1683 }
dea570e0 1684
14fbf50d
JL
1685 list_del_init(&ses->smb_ses_list);
1686 write_unlock(&cifs_tcp_ses_lock);
dea570e0 1687
14fbf50d
JL
1688 if (ses->status == CifsGood) {
1689 xid = GetXid();
1690 CIFSSMBLogoff(xid, ses);
1691 _FreeXid(xid);
1692 }
1693 sesInfoFree(ses);
1694 cifs_put_tcp_session(server);
1695}
dea570e0 1696
36988c76
JL
1697static struct cifsSesInfo *
1698cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
1699{
1700 int rc = -ENOMEM, xid;
1701 struct cifsSesInfo *ses;
1702
1703 xid = GetXid();
1704
4ff67b72 1705 ses = cifs_find_smb_ses(server, volume_info);
36988c76
JL
1706 if (ses) {
1707 cFYI(1, "Existing smb sess found (status=%d)", ses->status);
1708
36988c76 1709 mutex_lock(&ses->session_mutex);
198b5682
JL
1710 rc = cifs_negotiate_protocol(xid, ses);
1711 if (rc) {
1712 mutex_unlock(&ses->session_mutex);
1713 /* problem -- put our ses reference */
1714 cifs_put_smb_ses(ses);
1715 FreeXid(xid);
1716 return ERR_PTR(rc);
1717 }
36988c76
JL
1718 if (ses->need_reconnect) {
1719 cFYI(1, "Session needs reconnect");
1720 rc = cifs_setup_session(xid, ses,
1721 volume_info->local_nls);
1722 if (rc) {
1723 mutex_unlock(&ses->session_mutex);
1724 /* problem -- put our reference */
1725 cifs_put_smb_ses(ses);
1726 FreeXid(xid);
1727 return ERR_PTR(rc);
1728 }
1729 }
1730 mutex_unlock(&ses->session_mutex);
460cf341
JL
1731
1732 /* existing SMB ses has a server reference already */
1733 cifs_put_tcp_session(server);
36988c76
JL
1734 FreeXid(xid);
1735 return ses;
1736 }
1737
1738 cFYI(1, "Existing smb sess not found");
1739 ses = sesInfoAlloc();
1740 if (ses == NULL)
1741 goto get_ses_fail;
1742
1743 /* new SMB session uses our server ref */
1744 ses->server = server;
1745 if (server->addr.sockAddr6.sin6_family == AF_INET6)
1746 sprintf(ses->serverName, "%pI6",
1747 &server->addr.sockAddr6.sin6_addr);
1748 else
1749 sprintf(ses->serverName, "%pI4",
1750 &server->addr.sockAddr.sin_addr.s_addr);
1751
1752 if (volume_info->username)
1753 strncpy(ses->userName, volume_info->username,
1754 MAX_USERNAME_SIZE);
1755
1756 /* volume_info->password freed at unmount */
1757 if (volume_info->password) {
1758 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
1759 if (!ses->password)
1760 goto get_ses_fail;
1761 }
1762 if (volume_info->domainname) {
1763 int len = strlen(volume_info->domainname);
1764 ses->domainName = kmalloc(len + 1, GFP_KERNEL);
1765 if (ses->domainName)
1766 strcpy(ses->domainName, volume_info->domainname);
1767 }
3e4b3e1f 1768 ses->cred_uid = volume_info->cred_uid;
36988c76
JL
1769 ses->linux_uid = volume_info->linux_uid;
1770 ses->overrideSecFlg = volume_info->secFlg;
1771
1772 mutex_lock(&ses->session_mutex);
198b5682
JL
1773 rc = cifs_negotiate_protocol(xid, ses);
1774 if (!rc)
1775 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
36988c76 1776 mutex_unlock(&ses->session_mutex);
c8e56f1f 1777 if (rc)
36988c76
JL
1778 goto get_ses_fail;
1779
1780 /* success, put it on the list */
1781 write_lock(&cifs_tcp_ses_lock);
1782 list_add(&ses->smb_ses_list, &server->smb_ses_list);
1783 write_unlock(&cifs_tcp_ses_lock);
1784
1785 FreeXid(xid);
1786 return ses;
1787
1788get_ses_fail:
1789 sesInfoFree(ses);
1790 FreeXid(xid);
1791 return ERR_PTR(rc);
1792}
1793
f1987b44
JL
1794static struct cifsTconInfo *
1795cifs_find_tcon(struct cifsSesInfo *ses, const char *unc)
1796{
1797 struct list_head *tmp;
1798 struct cifsTconInfo *tcon;
1799
1800 write_lock(&cifs_tcp_ses_lock);
1801 list_for_each(tmp, &ses->tcon_list) {
1802 tcon = list_entry(tmp, struct cifsTconInfo, tcon_list);
1803 if (tcon->tidStatus == CifsExiting)
1804 continue;
1805 if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
dea570e0
SF
1806 continue;
1807
f1987b44
JL
1808 ++tcon->tc_count;
1809 write_unlock(&cifs_tcp_ses_lock);
dea570e0 1810 return tcon;
1da177e4 1811 }
f1987b44 1812 write_unlock(&cifs_tcp_ses_lock);
1da177e4
LT
1813 return NULL;
1814}
1815
f1987b44
JL
1816static void
1817cifs_put_tcon(struct cifsTconInfo *tcon)
1818{
1819 int xid;
1820 struct cifsSesInfo *ses = tcon->ses;
1821
d00c28de 1822 cFYI(1, "%s: tc_count=%d\n", __func__, tcon->tc_count);
f1987b44
JL
1823 write_lock(&cifs_tcp_ses_lock);
1824 if (--tcon->tc_count > 0) {
1825 write_unlock(&cifs_tcp_ses_lock);
1826 return;
1827 }
1828
1829 list_del_init(&tcon->tcon_list);
1830 write_unlock(&cifs_tcp_ses_lock);
1831
1832 xid = GetXid();
1833 CIFSSMBTDis(xid, tcon);
1834 _FreeXid(xid);
1835
d03382ce 1836 cifs_fscache_release_super_cookie(tcon);
9f841593 1837 tconInfoFree(tcon);
f1987b44
JL
1838 cifs_put_smb_ses(ses);
1839}
1840
d00c28de
JL
1841static struct cifsTconInfo *
1842cifs_get_tcon(struct cifsSesInfo *ses, struct smb_vol *volume_info)
1843{
1844 int rc, xid;
1845 struct cifsTconInfo *tcon;
1846
1847 tcon = cifs_find_tcon(ses, volume_info->UNC);
1848 if (tcon) {
1849 cFYI(1, "Found match on UNC path");
1850 /* existing tcon already has a reference */
1851 cifs_put_smb_ses(ses);
1852 if (tcon->seal != volume_info->seal)
1853 cERROR(1, "transport encryption setting "
1854 "conflicts with existing tid");
1855 return tcon;
1856 }
1857
1858 tcon = tconInfoAlloc();
1859 if (tcon == NULL) {
1860 rc = -ENOMEM;
1861 goto out_fail;
1862 }
1863
1864 tcon->ses = ses;
1865 if (volume_info->password) {
1866 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
1867 if (!tcon->password) {
1868 rc = -ENOMEM;
1869 goto out_fail;
1870 }
1871 }
1872
1873 if (strchr(volume_info->UNC + 3, '\\') == NULL
1874 && strchr(volume_info->UNC + 3, '/') == NULL) {
1875 cERROR(1, "Missing share name");
1876 rc = -ENODEV;
1877 goto out_fail;
1878 }
1879
1880 /* BB Do we need to wrap session_mutex around
1881 * this TCon call and Unix SetFS as
1882 * we do on SessSetup and reconnect? */
1883 xid = GetXid();
1884 rc = CIFSTCon(xid, ses, volume_info->UNC, tcon, volume_info->local_nls);
1885 FreeXid(xid);
1886 cFYI(1, "CIFS Tcon rc = %d", rc);
1887 if (rc)
1888 goto out_fail;
1889
1890 if (volume_info->nodfs) {
1891 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
1892 cFYI(1, "DFS disabled (%d)", tcon->Flags);
1893 }
1894 tcon->seal = volume_info->seal;
1895 /* we can have only one retry value for a connection
1896 to a share so for resources mounted more than once
1897 to the same server share the last value passed in
1898 for the retry flag is used */
1899 tcon->retry = volume_info->retry;
1900 tcon->nocase = volume_info->nocase;
1901 tcon->local_lease = volume_info->local_lease;
1902
1903 write_lock(&cifs_tcp_ses_lock);
1904 list_add(&tcon->tcon_list, &ses->tcon_list);
1905 write_unlock(&cifs_tcp_ses_lock);
1906
d03382ce
SJ
1907 cifs_fscache_get_super_cookie(tcon);
1908
d00c28de
JL
1909 return tcon;
1910
1911out_fail:
1912 tconInfoFree(tcon);
1913 return ERR_PTR(rc);
1914}
1915
1916
1da177e4 1917int
50c2f753
SF
1918get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path,
1919 const struct nls_table *nls_codepage, unsigned int *pnum_referrals,
366781c1 1920 struct dfs_info3_param **preferrals, int remap)
1da177e4
LT
1921{
1922 char *temp_unc;
1923 int rc = 0;
1924
1925 *pnum_referrals = 0;
366781c1 1926 *preferrals = NULL;
1da177e4
LT
1927
1928 if (pSesInfo->ipc_tid == 0) {
1929 temp_unc = kmalloc(2 /* for slashes */ +
50c2f753
SF
1930 strnlen(pSesInfo->serverName,
1931 SERVER_NAME_LEN_WITH_NULL * 2)
1da177e4
LT
1932 + 1 + 4 /* slash IPC$ */ + 2,
1933 GFP_KERNEL);
1934 if (temp_unc == NULL)
1935 return -ENOMEM;
1936 temp_unc[0] = '\\';
1937 temp_unc[1] = '\\';
1938 strcpy(temp_unc + 2, pSesInfo->serverName);
1939 strcpy(temp_unc + 2 + strlen(pSesInfo->serverName), "\\IPC$");
1940 rc = CIFSTCon(xid, pSesInfo, temp_unc, NULL, nls_codepage);
b6b38f70 1941 cFYI(1, "CIFS Tcon rc = %d ipc_tid = %d", rc, pSesInfo->ipc_tid);
1da177e4
LT
1942 kfree(temp_unc);
1943 }
1944 if (rc == 0)
c2cf07d5 1945 rc = CIFSGetDFSRefer(xid, pSesInfo, old_path, preferrals,
737b758c 1946 pnum_referrals, nls_codepage, remap);
366781c1
SF
1947 /* BB map targetUNCs to dfs_info3 structures, here or
1948 in CIFSGetDFSRefer BB */
1da177e4
LT
1949
1950 return rc;
1951}
1952
09e50d55
JL
1953#ifdef CONFIG_DEBUG_LOCK_ALLOC
1954static struct lock_class_key cifs_key[2];
1955static struct lock_class_key cifs_slock_key[2];
1956
1957static inline void
1958cifs_reclassify_socket4(struct socket *sock)
1959{
1960 struct sock *sk = sock->sk;
1961 BUG_ON(sock_owned_by_user(sk));
1962 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
1963 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
1964}
1965
1966static inline void
1967cifs_reclassify_socket6(struct socket *sock)
1968{
1969 struct sock *sk = sock->sk;
1970 BUG_ON(sock_owned_by_user(sk));
1971 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
1972 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
1973}
1974#else
1975static inline void
1976cifs_reclassify_socket4(struct socket *sock)
1977{
1978}
1979
1980static inline void
1981cifs_reclassify_socket6(struct socket *sock)
1982{
1983}
1984#endif
1985
1da177e4 1986/* See RFC1001 section 14 on representation of Netbios names */
50c2f753 1987static void rfc1002mangle(char *target, char *source, unsigned int length)
1da177e4 1988{
50c2f753 1989 unsigned int i, j;
1da177e4 1990
50c2f753 1991 for (i = 0, j = 0; i < (length); i++) {
1da177e4
LT
1992 /* mask a nibble at a time and encode */
1993 target[j] = 'A' + (0x0F & (source[i] >> 4));
1994 target[j+1] = 'A' + (0x0F & source[i]);
50c2f753 1995 j += 2;
1da177e4
LT
1996 }
1997
1998}
1999
2000
2001static int
bcf4b106 2002ipv4_connect(struct TCP_Server_Info *server)
1da177e4
LT
2003{
2004 int rc = 0;
6a5fa236 2005 int val;
bcf4b106 2006 bool connected = false;
1da177e4 2007 __be16 orig_port = 0;
bcf4b106 2008 struct socket *socket = server->ssocket;
1da177e4 2009
bcf4b106 2010 if (socket == NULL) {
50c2f753 2011 rc = sock_create_kern(PF_INET, SOCK_STREAM,
bcf4b106 2012 IPPROTO_TCP, &socket);
1da177e4 2013 if (rc < 0) {
b6b38f70 2014 cERROR(1, "Error %d creating socket", rc);
1da177e4 2015 return rc;
1da177e4 2016 }
bcf4b106
JL
2017
2018 /* BB other socket options to set KEEPALIVE, NODELAY? */
b6b38f70 2019 cFYI(1, "Socket created");
bcf4b106
JL
2020 server->ssocket = socket;
2021 socket->sk->sk_allocation = GFP_NOFS;
2022 cifs_reclassify_socket4(socket);
1da177e4
LT
2023 }
2024
bcf4b106
JL
2025 /* user overrode default port */
2026 if (server->addr.sockAddr.sin_port) {
2027 rc = socket->ops->connect(socket, (struct sockaddr *)
2028 &server->addr.sockAddr,
2029 sizeof(struct sockaddr_in), 0);
1da177e4 2030 if (rc >= 0)
bcf4b106 2031 connected = true;
50c2f753 2032 }
1da177e4 2033
fb8c4b14 2034 if (!connected) {
50c2f753 2035 /* save original port so we can retry user specified port
1da177e4 2036 later if fall back ports fail this time */
bcf4b106 2037 orig_port = server->addr.sockAddr.sin_port;
1da177e4
LT
2038
2039 /* do not retry on the same port we just failed on */
bcf4b106
JL
2040 if (server->addr.sockAddr.sin_port != htons(CIFS_PORT)) {
2041 server->addr.sockAddr.sin_port = htons(CIFS_PORT);
2042 rc = socket->ops->connect(socket,
2043 (struct sockaddr *)
2044 &server->addr.sockAddr,
2045 sizeof(struct sockaddr_in), 0);
1da177e4 2046 if (rc >= 0)
bcf4b106 2047 connected = true;
1da177e4
LT
2048 }
2049 }
2050 if (!connected) {
bcf4b106
JL
2051 server->addr.sockAddr.sin_port = htons(RFC1001_PORT);
2052 rc = socket->ops->connect(socket, (struct sockaddr *)
2053 &server->addr.sockAddr,
6345a3a8 2054 sizeof(struct sockaddr_in), 0);
50c2f753 2055 if (rc >= 0)
bcf4b106 2056 connected = true;
1da177e4
LT
2057 }
2058
2059 /* give up here - unless we want to retry on different
2060 protocol families some day */
2061 if (!connected) {
fb8c4b14 2062 if (orig_port)
bcf4b106 2063 server->addr.sockAddr.sin_port = orig_port;
b6b38f70 2064 cFYI(1, "Error %d connecting to server via ipv4", rc);
bcf4b106
JL
2065 sock_release(socket);
2066 server->ssocket = NULL;
1da177e4
LT
2067 return rc;
2068 }
bcf4b106
JL
2069
2070
2071 /*
2072 * Eventually check for other socket options to change from
2073 * the default. sock_setsockopt not used because it expects
2074 * user space buffer
2075 */
2076 socket->sk->sk_rcvtimeo = 7 * HZ;
da505c38 2077 socket->sk->sk_sndtimeo = 5 * HZ;
edf1ae40 2078
b387eaeb 2079 /* make the bufsizes depend on wsize/rsize and max requests */
bcf4b106
JL
2080 if (server->noautotune) {
2081 if (socket->sk->sk_sndbuf < (200 * 1024))
2082 socket->sk->sk_sndbuf = 200 * 1024;
2083 if (socket->sk->sk_rcvbuf < (140 * 1024))
2084 socket->sk->sk_rcvbuf = 140 * 1024;
edf1ae40 2085 }
1da177e4 2086
6a5fa236
SF
2087 if (server->tcp_nodelay) {
2088 val = 1;
2089 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
2090 (char *)&val, sizeof(val));
2091 if (rc)
b6b38f70 2092 cFYI(1, "set TCP_NODELAY socket option error %d", rc);
6a5fa236
SF
2093 }
2094
b6b38f70 2095 cFYI(1, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx",
bcf4b106 2096 socket->sk->sk_sndbuf,
b6b38f70 2097 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
bcf4b106 2098
1da177e4 2099 /* send RFC1001 sessinit */
bcf4b106 2100 if (server->addr.sockAddr.sin_port == htons(RFC1001_PORT)) {
1da177e4 2101 /* some servers require RFC1001 sessinit before sending
50c2f753 2102 negprot - BB check reconnection in case where second
1da177e4 2103 sessinit is sent but no second negprot */
50c2f753
SF
2104 struct rfc1002_session_packet *ses_init_buf;
2105 struct smb_hdr *smb_buf;
2106 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2107 GFP_KERNEL);
fb8c4b14 2108 if (ses_init_buf) {
1da177e4 2109 ses_init_buf->trailer.session_req.called_len = 32;
bcf4b106
JL
2110 if (server->server_RFC1001_name &&
2111 server->server_RFC1001_name[0] != 0)
8ecaf67a
JL
2112 rfc1002mangle(ses_init_buf->trailer.
2113 session_req.called_name,
bcf4b106 2114 server->server_RFC1001_name,
8ecaf67a 2115 RFC1001_NAME_LEN_WITH_NULL);
bcf4b106 2116 else
8ecaf67a
JL
2117 rfc1002mangle(ses_init_buf->trailer.
2118 session_req.called_name,
2119 DEFAULT_CIFS_CALLED_NAME,
2120 RFC1001_NAME_LEN_WITH_NULL);
a10faeb2 2121
1da177e4 2122 ses_init_buf->trailer.session_req.calling_len = 32;
bcf4b106 2123
1da177e4
LT
2124 /* calling name ends in null (byte 16) from old smb
2125 convention. */
bcf4b106
JL
2126 if (server->workstation_RFC1001_name &&
2127 server->workstation_RFC1001_name[0] != 0)
8ecaf67a
JL
2128 rfc1002mangle(ses_init_buf->trailer.
2129 session_req.calling_name,
bcf4b106 2130 server->workstation_RFC1001_name,
8ecaf67a 2131 RFC1001_NAME_LEN_WITH_NULL);
bcf4b106 2132 else
8ecaf67a
JL
2133 rfc1002mangle(ses_init_buf->trailer.
2134 session_req.calling_name,
2135 "LINUX_CIFS_CLNT",
2136 RFC1001_NAME_LEN_WITH_NULL);
bcf4b106 2137
1da177e4
LT
2138 ses_init_buf->trailer.session_req.scope1 = 0;
2139 ses_init_buf->trailer.session_req.scope2 = 0;
2140 smb_buf = (struct smb_hdr *)ses_init_buf;
2141 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2142 smb_buf->smb_buf_length = 0x81000044;
0496e02d 2143 rc = smb_send(server, smb_buf, 0x44);
1da177e4 2144 kfree(ses_init_buf);
50c2f753 2145 msleep(1); /* RFC1001 layer in at least one server
083d3a2c
SF
2146 requires very short break before negprot
2147 presumably because not expecting negprot
2148 to follow so fast. This is a simple
50c2f753 2149 solution that works without
083d3a2c
SF
2150 complicating the code and causes no
2151 significant slowing down on mount
2152 for everyone else */
1da177e4 2153 }
50c2f753 2154 /* else the negprot may still work without this
1da177e4 2155 even though malloc failed */
50c2f753 2156
1da177e4 2157 }
50c2f753 2158
1da177e4
LT
2159 return rc;
2160}
2161
2162static int
d5c5605c 2163ipv6_connect(struct TCP_Server_Info *server)
1da177e4
LT
2164{
2165 int rc = 0;
6a5fa236 2166 int val;
d5c5605c 2167 bool connected = false;
1da177e4 2168 __be16 orig_port = 0;
d5c5605c 2169 struct socket *socket = server->ssocket;
1da177e4 2170
d5c5605c 2171 if (socket == NULL) {
50c2f753 2172 rc = sock_create_kern(PF_INET6, SOCK_STREAM,
d5c5605c 2173 IPPROTO_TCP, &socket);
1da177e4 2174 if (rc < 0) {
b6b38f70 2175 cERROR(1, "Error %d creating ipv6 socket", rc);
d5c5605c 2176 socket = NULL;
1da177e4 2177 return rc;
1da177e4 2178 }
1da177e4 2179
d5c5605c 2180 /* BB other socket options to set KEEPALIVE, NODELAY? */
b6b38f70 2181 cFYI(1, "ipv6 Socket created");
d5c5605c
JL
2182 server->ssocket = socket;
2183 socket->sk->sk_allocation = GFP_NOFS;
2184 cifs_reclassify_socket6(socket);
2185 }
1da177e4 2186
d5c5605c
JL
2187 /* user overrode default port */
2188 if (server->addr.sockAddr6.sin6_port) {
2189 rc = socket->ops->connect(socket,
2190 (struct sockaddr *) &server->addr.sockAddr6,
6345a3a8 2191 sizeof(struct sockaddr_in6), 0);
1da177e4 2192 if (rc >= 0)
d5c5605c 2193 connected = true;
50c2f753 2194 }
1da177e4 2195
fb8c4b14 2196 if (!connected) {
50c2f753 2197 /* save original port so we can retry user specified port
1da177e4
LT
2198 later if fall back ports fail this time */
2199
d5c5605c 2200 orig_port = server->addr.sockAddr6.sin6_port;
1da177e4 2201 /* do not retry on the same port we just failed on */
d5c5605c
JL
2202 if (server->addr.sockAddr6.sin6_port != htons(CIFS_PORT)) {
2203 server->addr.sockAddr6.sin6_port = htons(CIFS_PORT);
2204 rc = socket->ops->connect(socket, (struct sockaddr *)
2205 &server->addr.sockAddr6,
6345a3a8 2206 sizeof(struct sockaddr_in6), 0);
1da177e4 2207 if (rc >= 0)
d5c5605c 2208 connected = true;
1da177e4
LT
2209 }
2210 }
2211 if (!connected) {
d5c5605c
JL
2212 server->addr.sockAddr6.sin6_port = htons(RFC1001_PORT);
2213 rc = socket->ops->connect(socket, (struct sockaddr *)
2214 &server->addr.sockAddr6,
2215 sizeof(struct sockaddr_in6), 0);
50c2f753 2216 if (rc >= 0)
d5c5605c 2217 connected = true;
1da177e4
LT
2218 }
2219
2220 /* give up here - unless we want to retry on different
2221 protocol families some day */
2222 if (!connected) {
fb8c4b14 2223 if (orig_port)
d5c5605c 2224 server->addr.sockAddr6.sin6_port = orig_port;
b6b38f70 2225 cFYI(1, "Error %d connecting to server via ipv6", rc);
d5c5605c
JL
2226 sock_release(socket);
2227 server->ssocket = NULL;
1da177e4
LT
2228 return rc;
2229 }
edf1ae40 2230
d5c5605c
JL
2231 /*
2232 * Eventually check for other socket options to change from
2233 * the default. sock_setsockopt not used because it expects
2234 * user space buffer
2235 */
2236 socket->sk->sk_rcvtimeo = 7 * HZ;
da505c38 2237 socket->sk->sk_sndtimeo = 5 * HZ;
6a5fa236
SF
2238
2239 if (server->tcp_nodelay) {
2240 val = 1;
2241 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
2242 (char *)&val, sizeof(val));
2243 if (rc)
b6b38f70 2244 cFYI(1, "set TCP_NODELAY socket option error %d", rc);
6a5fa236
SF
2245 }
2246
d5c5605c 2247 server->ssocket = socket;
50c2f753 2248
1da177e4
LT
2249 return rc;
2250}
2251
50c2f753
SF
2252void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon,
2253 struct super_block *sb, struct smb_vol *vol_info)
8af18971
SF
2254{
2255 /* if we are reconnecting then should we check to see if
2256 * any requested capabilities changed locally e.g. via
2257 * remount but we can not do much about it here
2258 * if they have (even if we could detect it by the following)
2259 * Perhaps we could add a backpointer to array of sb from tcon
2260 * or if we change to make all sb to same share the same
2261 * sb as NFS - then we only have one backpointer to sb.
2262 * What if we wanted to mount the server share twice once with
2263 * and once without posixacls or posix paths? */
2264 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
50c2f753 2265
c18c842b
SF
2266 if (vol_info && vol_info->no_linux_ext) {
2267 tcon->fsUnixInfo.Capability = 0;
2268 tcon->unix_ext = 0; /* Unix Extensions disabled */
b6b38f70 2269 cFYI(1, "Linux protocol extensions disabled");
c18c842b
SF
2270 return;
2271 } else if (vol_info)
2272 tcon->unix_ext = 1; /* Unix Extensions supported */
2273
2274 if (tcon->unix_ext == 0) {
b6b38f70 2275 cFYI(1, "Unix extensions disabled so not set on reconnect");
c18c842b
SF
2276 return;
2277 }
50c2f753 2278
fb8c4b14 2279 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
8af18971 2280 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
50c2f753 2281
8af18971
SF
2282 /* check for reconnect case in which we do not
2283 want to change the mount behavior if we can avoid it */
fb8c4b14 2284 if (vol_info == NULL) {
50c2f753 2285 /* turn off POSIX ACL and PATHNAMES if not set
8af18971
SF
2286 originally at mount time */
2287 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
2288 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
11b6d645
IM
2289 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2290 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
b6b38f70 2291 cERROR(1, "POSIXPATH support change");
8af18971 2292 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
11b6d645 2293 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
b6b38f70
JP
2294 cERROR(1, "possible reconnect error");
2295 cERROR(1, "server disabled POSIX path support");
11b6d645 2296 }
8af18971 2297 }
50c2f753 2298
8af18971 2299 cap &= CIFS_UNIX_CAP_MASK;
75865f8c 2300 if (vol_info && vol_info->no_psx_acl)
8af18971 2301 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
75865f8c 2302 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
b6b38f70 2303 cFYI(1, "negotiated posix acl support");
fb8c4b14 2304 if (sb)
8af18971
SF
2305 sb->s_flags |= MS_POSIXACL;
2306 }
2307
75865f8c 2308 if (vol_info && vol_info->posix_paths == 0)
8af18971 2309 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
75865f8c 2310 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
b6b38f70 2311 cFYI(1, "negotiate posix pathnames");
75865f8c 2312 if (sb)
50c2f753 2313 CIFS_SB(sb)->mnt_cifs_flags |=
8af18971
SF
2314 CIFS_MOUNT_POSIX_PATHS;
2315 }
50c2f753 2316
984acfe1
SF
2317 /* We might be setting the path sep back to a different
2318 form if we are reconnecting and the server switched its
50c2f753 2319 posix path capability for this share */
75865f8c 2320 if (sb && (CIFS_SB(sb)->prepathlen > 0))
984acfe1 2321 CIFS_SB(sb)->prepath[0] = CIFS_DIR_SEP(CIFS_SB(sb));
75865f8c
SF
2322
2323 if (sb && (CIFS_SB(sb)->rsize > 127 * 1024)) {
2324 if ((cap & CIFS_UNIX_LARGE_READ_CAP) == 0) {
2325 CIFS_SB(sb)->rsize = 127 * 1024;
b6b38f70 2326 cFYI(DBG2, "larger reads not supported by srv");
75865f8c
SF
2327 }
2328 }
50c2f753
SF
2329
2330
b6b38f70 2331 cFYI(1, "Negotiate caps 0x%x", (int)cap);
8af18971 2332#ifdef CONFIG_CIFS_DEBUG2
75865f8c 2333 if (cap & CIFS_UNIX_FCNTL_CAP)
b6b38f70 2334 cFYI(1, "FCNTL cap");
75865f8c 2335 if (cap & CIFS_UNIX_EXTATTR_CAP)
b6b38f70 2336 cFYI(1, "EXTATTR cap");
75865f8c 2337 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
b6b38f70 2338 cFYI(1, "POSIX path cap");
75865f8c 2339 if (cap & CIFS_UNIX_XATTR_CAP)
b6b38f70 2340 cFYI(1, "XATTR cap");
75865f8c 2341 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
b6b38f70 2342 cFYI(1, "POSIX ACL cap");
75865f8c 2343 if (cap & CIFS_UNIX_LARGE_READ_CAP)
b6b38f70 2344 cFYI(1, "very large read cap");
75865f8c 2345 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
b6b38f70 2346 cFYI(1, "very large write cap");
8af18971
SF
2347#endif /* CIFS_DEBUG2 */
2348 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
442aa310 2349 if (vol_info == NULL) {
b6b38f70 2350 cFYI(1, "resetting capabilities failed");
442aa310 2351 } else
b6b38f70 2352 cERROR(1, "Negotiating Unix capabilities "
5a44b319
SF
2353 "with the server failed. Consider "
2354 "mounting with the Unix Extensions\n"
2355 "disabled, if problems are found, "
2356 "by specifying the nounix mount "
b6b38f70 2357 "option.");
5a44b319 2358
8af18971
SF
2359 }
2360 }
2361}
2362
03a143c9
SF
2363static void
2364convert_delimiter(char *path, char delim)
2365{
2366 int i;
c2d68ea6 2367 char old_delim;
03a143c9
SF
2368
2369 if (path == NULL)
2370 return;
2371
582d21e5 2372 if (delim == '/')
c2d68ea6
SF
2373 old_delim = '\\';
2374 else
2375 old_delim = '/';
2376
03a143c9 2377 for (i = 0; path[i] != '\0'; i++) {
c2d68ea6 2378 if (path[i] == old_delim)
03a143c9
SF
2379 path[i] = delim;
2380 }
2381}
2382
3b795210
SF
2383static void setup_cifs_sb(struct smb_vol *pvolume_info,
2384 struct cifs_sb_info *cifs_sb)
b1c8d2b4 2385{
3b795210 2386 if (pvolume_info->rsize > CIFSMaxBufSize) {
b6b38f70
JP
2387 cERROR(1, "rsize %d too large, using MaxBufSize",
2388 pvolume_info->rsize);
3b795210
SF
2389 cifs_sb->rsize = CIFSMaxBufSize;
2390 } else if ((pvolume_info->rsize) &&
2391 (pvolume_info->rsize <= CIFSMaxBufSize))
2392 cifs_sb->rsize = pvolume_info->rsize;
2393 else /* default */
2394 cifs_sb->rsize = CIFSMaxBufSize;
2395
2396 if (pvolume_info->wsize > PAGEVEC_SIZE * PAGE_CACHE_SIZE) {
b6b38f70
JP
2397 cERROR(1, "wsize %d too large, using 4096 instead",
2398 pvolume_info->wsize);
3b795210
SF
2399 cifs_sb->wsize = 4096;
2400 } else if (pvolume_info->wsize)
2401 cifs_sb->wsize = pvolume_info->wsize;
2402 else
2403 cifs_sb->wsize = min_t(const int,
2404 PAGEVEC_SIZE * PAGE_CACHE_SIZE,
2405 127*1024);
2406 /* old default of CIFSMaxBufSize was too small now
2407 that SMB Write2 can send multiple pages in kvec.
2408 RFC1001 does not describe what happens when frame
2409 bigger than 128K is sent so use that as max in
2410 conjunction with 52K kvec constraint on arch with 4K
2411 page size */
2412
2413 if (cifs_sb->rsize < 2048) {
2414 cifs_sb->rsize = 2048;
2415 /* Windows ME may prefer this */
b6b38f70 2416 cFYI(1, "readsize set to minimum: 2048");
3b795210
SF
2417 }
2418 /* calculate prepath */
2419 cifs_sb->prepath = pvolume_info->prepath;
2420 if (cifs_sb->prepath) {
2421 cifs_sb->prepathlen = strlen(cifs_sb->prepath);
2422 /* we can not convert the / to \ in the path
2423 separators in the prefixpath yet because we do not
2424 know (until reset_cifs_unix_caps is called later)
2425 whether POSIX PATH CAP is available. We normalize
2426 the / to \ after reset_cifs_unix_caps is called */
2427 pvolume_info->prepath = NULL;
2428 } else
2429 cifs_sb->prepathlen = 0;
2430 cifs_sb->mnt_uid = pvolume_info->linux_uid;
2431 cifs_sb->mnt_gid = pvolume_info->linux_gid;
2432 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
2433 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
b6b38f70
JP
2434 cFYI(1, "file mode: 0x%x dir mode: 0x%x",
2435 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3b795210
SF
2436
2437 if (pvolume_info->noperm)
2438 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
2439 if (pvolume_info->setuids)
2440 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
2441 if (pvolume_info->server_ino)
2442 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
2443 if (pvolume_info->remap)
2444 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
2445 if (pvolume_info->no_xattr)
2446 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
2447 if (pvolume_info->sfu_emul)
2448 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
2449 if (pvolume_info->nobrl)
2450 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
be652445 2451 if (pvolume_info->nostrictsync)
4717bed6 2452 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
13a6e42a
SF
2453 if (pvolume_info->mand_lock)
2454 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3b795210
SF
2455 if (pvolume_info->cifs_acl)
2456 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
2457 if (pvolume_info->override_uid)
2458 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
2459 if (pvolume_info->override_gid)
2460 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
2461 if (pvolume_info->dynperm)
2462 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
fa1df75d
SJ
2463 if (pvolume_info->fsc)
2464 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3b795210 2465 if (pvolume_info->direct_io) {
b6b38f70 2466 cFYI(1, "mounting share using direct i/o");
3b795210
SF
2467 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
2468 }
2469
2470 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
b6b38f70
JP
2471 cERROR(1, "mount option dynperm ignored if cifsacl "
2472 "mount option supported");
b1c8d2b4
JL
2473}
2474
e4cce94c
IM
2475static int
2476is_path_accessible(int xid, struct cifsTconInfo *tcon,
2477 struct cifs_sb_info *cifs_sb, const char *full_path)
2478{
2479 int rc;
e4cce94c
IM
2480 FILE_ALL_INFO *pfile_info;
2481
e4cce94c
IM
2482 pfile_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
2483 if (pfile_info == NULL)
2484 return -ENOMEM;
2485
2486 rc = CIFSSMBQPathInfo(xid, tcon, full_path, pfile_info,
2487 0 /* not legacy */, cifs_sb->local_nls,
2488 cifs_sb->mnt_cifs_flags &
2489 CIFS_MOUNT_MAP_SPECIAL_CHR);
2490 kfree(pfile_info);
2491 return rc;
2492}
2493
1bfe73c2
IM
2494static void
2495cleanup_volume_info(struct smb_vol **pvolume_info)
2496{
2497 struct smb_vol *volume_info;
2498
ad6cca6d 2499 if (!pvolume_info || !*pvolume_info)
1bfe73c2
IM
2500 return;
2501
2502 volume_info = *pvolume_info;
2503 kzfree(volume_info->password);
2504 kfree(volume_info->UNC);
2505 kfree(volume_info->prepath);
2506 kfree(volume_info);
2507 *pvolume_info = NULL;
2508 return;
2509}
2510
2d6d589d 2511#ifdef CONFIG_CIFS_DFS_UPCALL
1bfe73c2
IM
2512/* build_path_to_root returns full path to root when
2513 * we do not have an exiting connection (tcon) */
2514static char *
2515build_unc_path_to_root(const struct smb_vol *volume_info,
2516 const struct cifs_sb_info *cifs_sb)
2517{
2518 char *full_path;
2519
2520 int unc_len = strnlen(volume_info->UNC, MAX_TREE_SIZE + 1);
2521 full_path = kmalloc(unc_len + cifs_sb->prepathlen + 1, GFP_KERNEL);
2522 if (full_path == NULL)
2523 return ERR_PTR(-ENOMEM);
2524
2525 strncpy(full_path, volume_info->UNC, unc_len);
2526 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) {
2527 int i;
2528 for (i = 0; i < unc_len; i++) {
2529 if (full_path[i] == '\\')
2530 full_path[i] = '/';
2531 }
2532 }
2533
2534 if (cifs_sb->prepathlen)
2535 strncpy(full_path + unc_len, cifs_sb->prepath,
2536 cifs_sb->prepathlen);
2537
2538 full_path[unc_len + cifs_sb->prepathlen] = 0; /* add trailing null */
2539 return full_path;
2540}
2d6d589d 2541#endif
1bfe73c2 2542
1da177e4
LT
2543int
2544cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
1bfe73c2 2545 char *mount_data_global, const char *devname)
1da177e4 2546{
a2934c7b 2547 int rc;
1da177e4 2548 int xid;
7586b765 2549 struct smb_vol *volume_info;
a2934c7b
JL
2550 struct cifsSesInfo *pSesInfo;
2551 struct cifsTconInfo *tcon;
2552 struct TCP_Server_Info *srvTcp;
e4cce94c 2553 char *full_path;
2d6d589d
SF
2554 char *mount_data = mount_data_global;
2555#ifdef CONFIG_CIFS_DFS_UPCALL
1bfe73c2
IM
2556 struct dfs_info3_param *referrals = NULL;
2557 unsigned int num_referrals = 0;
5c2503a8 2558 int referral_walks_count = 0;
1bfe73c2 2559try_mount_again:
2d6d589d 2560#endif
a2934c7b
JL
2561 rc = 0;
2562 tcon = NULL;
2563 pSesInfo = NULL;
2564 srvTcp = NULL;
1bfe73c2 2565 full_path = NULL;
1da177e4
LT
2566
2567 xid = GetXid();
2568
7586b765
JL
2569 volume_info = kzalloc(sizeof(struct smb_vol), GFP_KERNEL);
2570 if (!volume_info) {
2571 rc = -ENOMEM;
2572 goto out;
2573 }
50c2f753 2574
7586b765 2575 if (cifs_parse_mount_options(mount_data, devname, volume_info)) {
70fe7dc0
JL
2576 rc = -EINVAL;
2577 goto out;
1da177e4
LT
2578 }
2579
7586b765 2580 if (volume_info->nullauth) {
b6b38f70 2581 cFYI(1, "null user");
7586b765
JL
2582 volume_info->username = "";
2583 } else if (volume_info->username) {
1da177e4 2584 /* BB fixme parse for domain name here */
b6b38f70 2585 cFYI(1, "Username: %s", volume_info->username);
1da177e4 2586 } else {
bf820679 2587 cifserror("No username specified");
50c2f753
SF
2588 /* In userspace mount helper we can get user name from alternate
2589 locations such as env variables and files on disk */
70fe7dc0
JL
2590 rc = -EINVAL;
2591 goto out;
1da177e4
LT
2592 }
2593
1da177e4 2594 /* this is needed for ASCII cp to Unicode converts */
7586b765 2595 if (volume_info->iocharset == NULL) {
a5fc4ce0
JL
2596 /* load_nls_default cannot return null */
2597 volume_info->local_nls = load_nls_default();
1da177e4 2598 } else {
a5fc4ce0
JL
2599 volume_info->local_nls = load_nls(volume_info->iocharset);
2600 if (volume_info->local_nls == NULL) {
b6b38f70
JP
2601 cERROR(1, "CIFS mount error: iocharset %s not found",
2602 volume_info->iocharset);
70fe7dc0
JL
2603 rc = -ELIBACC;
2604 goto out;
1da177e4
LT
2605 }
2606 }
a5fc4ce0 2607 cifs_sb->local_nls = volume_info->local_nls;
1da177e4 2608
63c038c2 2609 /* get a reference to a tcp session */
7586b765 2610 srvTcp = cifs_get_tcp_session(volume_info);
63c038c2
JL
2611 if (IS_ERR(srvTcp)) {
2612 rc = PTR_ERR(srvTcp);
2613 goto out;
1da177e4
LT
2614 }
2615
36988c76
JL
2616 /* get a reference to a SMB session */
2617 pSesInfo = cifs_get_smb_ses(srvTcp, volume_info);
2618 if (IS_ERR(pSesInfo)) {
2619 rc = PTR_ERR(pSesInfo);
2620 pSesInfo = NULL;
2621 goto mount_fail_check;
1da177e4 2622 }
50c2f753 2623
d00c28de
JL
2624 setup_cifs_sb(volume_info, cifs_sb);
2625 if (pSesInfo->capabilities & CAP_LARGE_FILES)
2626 sb->s_maxbytes = MAX_LFS_FILESIZE;
2627 else
2628 sb->s_maxbytes = MAX_NON_LFS;
1da177e4 2629
8af18971 2630 /* BB FIXME fix time_gran to be larger for LANMAN sessions */
1da177e4
LT
2631 sb->s_time_gran = 100;
2632
d00c28de
JL
2633 /* search for existing tcon to this server share */
2634 tcon = cifs_get_tcon(pSesInfo, volume_info);
2635 if (IS_ERR(tcon)) {
2636 rc = PTR_ERR(tcon);
2637 tcon = NULL;
1bfe73c2 2638 goto remote_path_check;
d00c28de 2639 }
1bfe73c2 2640
d82c2df5 2641 cifs_sb->tcon = tcon;
c18c842b 2642
d82c2df5
SF
2643 /* do not care if following two calls succeed - informational */
2644 if (!tcon->ipc) {
2645 CIFSSMBQFSDeviceInfo(xid, tcon);
2646 CIFSSMBQFSAttributeInfo(xid, tcon);
2647 }
03a143c9 2648
d82c2df5
SF
2649 /* tell server which Unix caps we support */
2650 if (tcon->ses->capabilities & CAP_UNIX)
2651 /* reset of caps checks mount to see if unix extensions
2652 disabled for just this mount */
7586b765 2653 reset_cifs_unix_caps(xid, tcon, sb, volume_info);
d82c2df5
SF
2654 else
2655 tcon->unix_ext = 0; /* server does not support them */
c18c842b 2656
d82c2df5
SF
2657 /* convert forward to back slashes in prepath here if needed */
2658 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) == 0)
2659 convert_delimiter(cifs_sb->prepath, CIFS_DIR_SEP(cifs_sb));
03a143c9 2660
d82c2df5
SF
2661 if ((tcon->unix_ext == 0) && (cifs_sb->rsize > (1024 * 127))) {
2662 cifs_sb->rsize = 1024 * 127;
b6b38f70 2663 cFYI(DBG2, "no very large read support, rsize now 127K");
1da177e4 2664 }
d82c2df5
SF
2665 if (!(tcon->ses->capabilities & CAP_LARGE_WRITE_X))
2666 cifs_sb->wsize = min(cifs_sb->wsize,
2667 (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE));
2668 if (!(tcon->ses->capabilities & CAP_LARGE_READ_X))
2669 cifs_sb->rsize = min(cifs_sb->rsize,
2670 (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE));
1da177e4 2671
1bfe73c2
IM
2672remote_path_check:
2673 /* check if a whole path (including prepath) is not remote */
2674 if (!rc && cifs_sb->prepathlen && tcon) {
e4cce94c
IM
2675 /* build_path_to_root works only when we have a valid tcon */
2676 full_path = cifs_build_path_to_root(cifs_sb);
2677 if (full_path == NULL) {
2678 rc = -ENOMEM;
2679 goto mount_fail_check;
2680 }
2681 rc = is_path_accessible(xid, tcon, cifs_sb, full_path);
1bfe73c2 2682 if (rc != -EREMOTE) {
e4cce94c
IM
2683 kfree(full_path);
2684 goto mount_fail_check;
2685 }
2686 kfree(full_path);
2687 }
2688
1bfe73c2
IM
2689 /* get referral if needed */
2690 if (rc == -EREMOTE) {
d036f50f 2691#ifdef CONFIG_CIFS_DFS_UPCALL
5c2503a8
IM
2692 if (referral_walks_count > MAX_NESTED_LINKS) {
2693 /*
2694 * BB: when we implement proper loop detection,
2695 * we will remove this check. But now we need it
2696 * to prevent an indefinite loop if 'DFS tree' is
2697 * misconfigured (i.e. has loops).
2698 */
2699 rc = -ELOOP;
2700 goto mount_fail_check;
2701 }
1bfe73c2
IM
2702 /* convert forward to back slashes in prepath here if needed */
2703 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) == 0)
2704 convert_delimiter(cifs_sb->prepath,
2705 CIFS_DIR_SEP(cifs_sb));
2706 full_path = build_unc_path_to_root(volume_info, cifs_sb);
2707 if (IS_ERR(full_path)) {
2708 rc = PTR_ERR(full_path);
2709 goto mount_fail_check;
2710 }
2711
b6b38f70 2712 cFYI(1, "Getting referral for: %s", full_path);
1bfe73c2
IM
2713 rc = get_dfs_path(xid, pSesInfo , full_path + 1,
2714 cifs_sb->local_nls, &num_referrals, &referrals,
2715 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
2716 if (!rc && num_referrals > 0) {
2717 char *fake_devname = NULL;
2718
2719 if (mount_data != mount_data_global)
2720 kfree(mount_data);
7b91e266 2721
1bfe73c2
IM
2722 mount_data = cifs_compose_mount_options(
2723 cifs_sb->mountdata, full_path + 1,
2724 referrals, &fake_devname);
7b91e266 2725
1bfe73c2 2726 free_dfs_info_array(referrals, num_referrals);
7b91e266
JL
2727 kfree(fake_devname);
2728 kfree(full_path);
2729
2730 if (IS_ERR(mount_data)) {
2731 rc = PTR_ERR(mount_data);
2732 mount_data = NULL;
2733 goto mount_fail_check;
2734 }
1bfe73c2
IM
2735
2736 if (tcon)
2737 cifs_put_tcon(tcon);
2738 else if (pSesInfo)
2739 cifs_put_smb_ses(pSesInfo);
2740
2741 cleanup_volume_info(&volume_info);
5c2503a8 2742 referral_walks_count++;
a2934c7b 2743 FreeXid(xid);
1bfe73c2
IM
2744 goto try_mount_again;
2745 }
d036f50f
SF
2746#else /* No DFS support, return error on mount */
2747 rc = -EOPNOTSUPP;
2748#endif
1bfe73c2
IM
2749 }
2750
2751mount_fail_check:
2752 /* on error free sesinfo and tcon struct if needed */
2753 if (rc) {
2754 if (mount_data != mount_data_global)
2755 kfree(mount_data);
2756 /* If find_unc succeeded then rc == 0 so we can not end */
2757 /* up accidently freeing someone elses tcon struct */
2758 if (tcon)
2759 cifs_put_tcon(tcon);
2760 else if (pSesInfo)
2761 cifs_put_smb_ses(pSesInfo);
2762 else
2763 cifs_put_tcp_session(srvTcp);
2764 goto out;
2765 }
2766
7586b765 2767 /* volume_info->password is freed above when existing session found
1da177e4
LT
2768 (in which case it is not needed anymore) but when new sesion is created
2769 the password ptr is put in the new session structure (in which case the
2770 password will be freed at unmount time) */
70fe7dc0
JL
2771out:
2772 /* zero out password before freeing */
1bfe73c2 2773 cleanup_volume_info(&volume_info);
1da177e4
LT
2774 FreeXid(xid);
2775 return rc;
2776}
2777
1da177e4
LT
2778int
2779CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
2780 const char *tree, struct cifsTconInfo *tcon,
2781 const struct nls_table *nls_codepage)
2782{
2783 struct smb_hdr *smb_buffer;
2784 struct smb_hdr *smb_buffer_response;
2785 TCONX_REQ *pSMB;
2786 TCONX_RSP *pSMBr;
2787 unsigned char *bcc_ptr;
2788 int rc = 0;
cc20c031 2789 int length, bytes_left;
1da177e4
LT
2790 __u16 count;
2791
2792 if (ses == NULL)
2793 return -EIO;
2794
2795 smb_buffer = cifs_buf_get();
ca43e3be 2796 if (smb_buffer == NULL)
1da177e4 2797 return -ENOMEM;
ca43e3be 2798
1da177e4
LT
2799 smb_buffer_response = smb_buffer;
2800
2801 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
2802 NULL /*no tid */ , 4 /*wct */ );
1982c344
SF
2803
2804 smb_buffer->Mid = GetNextMid(ses->server);
1da177e4
LT
2805 smb_buffer->Uid = ses->Suid;
2806 pSMB = (TCONX_REQ *) smb_buffer;
2807 pSMBr = (TCONX_RSP *) smb_buffer_response;
2808
2809 pSMB->AndXCommand = 0xFF;
2810 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
1da177e4 2811 bcc_ptr = &pSMB->Password[0];
fb8c4b14 2812 if ((ses->server->secMode) & SECMODE_USER) {
eeac8047 2813 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
7c7b25bc 2814 *bcc_ptr = 0; /* password is null byte */
eeac8047 2815 bcc_ptr++; /* skip password */
7c7b25bc 2816 /* already aligned so no need to do it below */
eeac8047 2817 } else {
7c7b25bc 2818 pSMB->PasswordLength = cpu_to_le16(CIFS_SESS_KEY_SIZE);
eeac8047
SF
2819 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
2820 specified as required (when that support is added to
2821 the vfs in the future) as only NTLM or the much
7c7b25bc 2822 weaker LANMAN (which we do not send by default) is accepted
eeac8047
SF
2823 by Samba (not sure whether other servers allow
2824 NTLMv2 password here) */
7c7b25bc 2825#ifdef CONFIG_CIFS_WEAK_PW_HASH
04912d6a 2826 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
00e485b0
JL
2827 (ses->server->secType == LANMAN))
2828 calc_lanman_hash(tcon->password, ses->server->cryptKey,
4e53a3fb
JL
2829 ses->server->secMode &
2830 SECMODE_PW_ENCRYPT ? true : false,
2831 bcc_ptr);
7c7b25bc
SF
2832 else
2833#endif /* CIFS_WEAK_PW_HASH */
00e485b0 2834 SMBNTencrypt(tcon->password, ses->server->cryptKey,
eeac8047
SF
2835 bcc_ptr);
2836
7c7b25bc 2837 bcc_ptr += CIFS_SESS_KEY_SIZE;
fb8c4b14 2838 if (ses->capabilities & CAP_UNICODE) {
7c7b25bc
SF
2839 /* must align unicode strings */
2840 *bcc_ptr = 0; /* null byte password */
2841 bcc_ptr++;
2842 }
eeac8047 2843 }
1da177e4 2844
50c2f753 2845 if (ses->server->secMode &
a878fb22 2846 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
1da177e4
LT
2847 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
2848
2849 if (ses->capabilities & CAP_STATUS32) {
2850 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
2851 }
2852 if (ses->capabilities & CAP_DFS) {
2853 smb_buffer->Flags2 |= SMBFLG2_DFS;
2854 }
2855 if (ses->capabilities & CAP_UNICODE) {
2856 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
2857 length =
50c2f753
SF
2858 cifs_strtoUCS((__le16 *) bcc_ptr, tree,
2859 6 /* max utf8 char length in bytes */ *
a878fb22
SF
2860 (/* server len*/ + 256 /* share len */), nls_codepage);
2861 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
1da177e4
LT
2862 bcc_ptr += 2; /* skip trailing null */
2863 } else { /* ASCII */
1da177e4
LT
2864 strcpy(bcc_ptr, tree);
2865 bcc_ptr += strlen(tree) + 1;
2866 }
2867 strcpy(bcc_ptr, "?????");
2868 bcc_ptr += strlen("?????");
2869 bcc_ptr += 1;
2870 count = bcc_ptr - &pSMB->Password[0];
2871 pSMB->hdr.smb_buf_length += count;
2872 pSMB->ByteCount = cpu_to_le16(count);
2873
133672ef
SF
2874 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
2875 CIFS_STD_OP);
1da177e4 2876
1da177e4
LT
2877 /* above now done in SendReceive */
2878 if ((rc == 0) && (tcon != NULL)) {
0e0d2cf3
SF
2879 bool is_unicode;
2880
1da177e4 2881 tcon->tidStatus = CifsGood;
3b795210 2882 tcon->need_reconnect = false;
1da177e4
LT
2883 tcon->tid = smb_buffer_response->Tid;
2884 bcc_ptr = pByteArea(smb_buffer_response);
cc20c031
JL
2885 bytes_left = BCC(smb_buffer_response);
2886 length = strnlen(bcc_ptr, bytes_left - 2);
0e0d2cf3
SF
2887 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
2888 is_unicode = true;
2889 else
2890 is_unicode = false;
2891
cc20c031 2892
50c2f753 2893 /* skip service field (NB: this field is always ASCII) */
7f8ed420
SF
2894 if (length == 3) {
2895 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
2896 (bcc_ptr[2] == 'C')) {
b6b38f70 2897 cFYI(1, "IPC connection");
7f8ed420
SF
2898 tcon->ipc = 1;
2899 }
2900 } else if (length == 2) {
2901 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
2902 /* the most common case */
b6b38f70 2903 cFYI(1, "disk share connection");
7f8ed420
SF
2904 }
2905 }
50c2f753 2906 bcc_ptr += length + 1;
cc20c031 2907 bytes_left -= (length + 1);
1da177e4 2908 strncpy(tcon->treeName, tree, MAX_TREE_SIZE);
cc20c031
JL
2909
2910 /* mostly informational -- no need to fail on error here */
90a98b2f 2911 kfree(tcon->nativeFileSystem);
d185cda7 2912 tcon->nativeFileSystem = cifs_strndup_from_ucs(bcc_ptr,
0e0d2cf3 2913 bytes_left, is_unicode,
cc20c031
JL
2914 nls_codepage);
2915
b6b38f70 2916 cFYI(1, "nativeFileSystem=%s", tcon->nativeFileSystem);
cc20c031 2917
fb8c4b14 2918 if ((smb_buffer_response->WordCount == 3) ||
1a4e15a0
SF
2919 (smb_buffer_response->WordCount == 7))
2920 /* field is in same location */
3979877e
SF
2921 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
2922 else
2923 tcon->Flags = 0;
b6b38f70 2924 cFYI(1, "Tcon flags: 0x%x ", tcon->Flags);
1da177e4 2925 } else if ((rc == 0) && tcon == NULL) {
50c2f753 2926 /* all we need to save for IPC$ connection */
1da177e4
LT
2927 ses->ipc_tid = smb_buffer_response->Tid;
2928 }
2929
a8a11d39 2930 cifs_buf_release(smb_buffer);
1da177e4
LT
2931 return rc;
2932}
2933
2934int
2935cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb)
2936{
2937 int rc = 0;
50c2f753 2938 char *tmp;
1da177e4 2939
f1987b44
JL
2940 if (cifs_sb->tcon)
2941 cifs_put_tcon(cifs_sb->tcon);
50c2f753 2942
1da177e4 2943 cifs_sb->tcon = NULL;
2fe87f02
SF
2944 tmp = cifs_sb->prepath;
2945 cifs_sb->prepathlen = 0;
2946 cifs_sb->prepath = NULL;
2947 kfree(tmp);
1da177e4 2948
88e7d705 2949 return rc;
50c2f753 2950}
1da177e4 2951
198b5682 2952int cifs_negotiate_protocol(unsigned int xid, struct cifsSesInfo *ses)
1da177e4
LT
2953{
2954 int rc = 0;
198b5682 2955 struct TCP_Server_Info *server = ses->server;
1da177e4 2956
198b5682
JL
2957 /* only send once per connect */
2958 if (server->maxBuf != 0)
2959 return 0;
2960
2961 rc = CIFSSMBNegotiate(xid, ses);
2962 if (rc == -EAGAIN) {
2963 /* retry only once on 1st time connection */
2964 rc = CIFSSMBNegotiate(xid, ses);
2965 if (rc == -EAGAIN)
2966 rc = -EHOSTDOWN;
1da177e4 2967 }
198b5682
JL
2968 if (rc == 0) {
2969 spin_lock(&GlobalMid_Lock);
2970 if (server->tcpStatus != CifsExiting)
2971 server->tcpStatus = CifsGood;
2972 else
2973 rc = -EHOSTDOWN;
2974 spin_unlock(&GlobalMid_Lock);
26b994fa 2975
198b5682
JL
2976 }
2977
2978 return rc;
2979}
2980
2981
2982int cifs_setup_session(unsigned int xid, struct cifsSesInfo *ses,
2983 struct nls_table *nls_info)
2984{
2985 int rc = 0;
2986 struct TCP_Server_Info *server = ses->server;
26b994fa 2987
198b5682
JL
2988 ses->flags = 0;
2989 ses->capabilities = server->capabilities;
26b994fa 2990 if (linuxExtEnabled == 0)
198b5682 2991 ses->capabilities &= (~CAP_UNIX);
20418acd 2992
b6b38f70
JP
2993 cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
2994 server->secMode, server->capabilities, server->timeAdj);
cb7691b6 2995
198b5682 2996 rc = CIFS_SessSetup(xid, ses, nls_info);
26b994fa 2997 if (rc) {
b6b38f70 2998 cERROR(1, "Send error in SessSetup = %d", rc);
26b994fa 2999 } else {
b6b38f70 3000 cFYI(1, "CIFS Session Established successfully");
20418acd 3001 spin_lock(&GlobalMid_Lock);
198b5682
JL
3002 ses->status = CifsGood;
3003 ses->need_reconnect = false;
20418acd 3004 spin_unlock(&GlobalMid_Lock);
1da177e4 3005 }
26b994fa 3006
1da177e4
LT
3007 return rc;
3008}
3009