~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/cifs/connect.c

Version: ~ [ linux-5.4 ] ~ [ linux-5.3.13 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.86 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.156 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.203 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.202 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.78 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp