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