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