~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to fs/cifs/connect.c

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

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