2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *    fs / cifs / connect . c 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-24 18:07:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *    Copyright  ( C )  International  Business  Machines   Corp . ,  2002 , 2011 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 *    Author ( s ) :  Steve  French  ( sfrench @ us . ibm . com ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *    This  library  is  free  software ;  you  can  redistribute  it  and / or  modify 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *    it  under  the  terms  of  the  GNU  Lesser  General  Public  License  as  published 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *    by  the  Free  Software  Foundation ;  either  version  2.1  of  the  License ,  or 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *    ( at  your  option )  any  later  version . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *    This  library  is  distributed  in  the  hope  that  it  will  be  useful , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *    but  WITHOUT  ANY  WARRANTY ;  without  even  the  implied  warranty  of 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *    MERCHANTABILITY  or  FITNESS  FOR  A  PARTICULAR  PURPOSE .   See 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *    the  GNU  Lesser  General  Public  License  for  more  details . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *    You  should  have  received  a  copy  of  the  GNU  Lesser  General  Public  License 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *    along  with  this  library ;  if  not ,  write  to  the  Free  Software 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-10 01:16:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *    Foundation ,  Inc . ,  59  Temple  Place ,  Suite  330 ,  Boston ,  MA  02111 - 1307  USA 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/fs.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/net.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/string.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/list.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/wait.h> 
  
						 
					
						
							
								
									
										
											 
										
											
												include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
percpu.h is included by sched.h and module.h and thus ends up being
included when building most .c files.  percpu.h includes slab.h which
in turn includes gfp.h making everything defined by the two files
universally available and complicating inclusion dependencies.
percpu.h -> slab.h dependency is about to be removed.  Prepare for
this change by updating users of gfp and slab facilities include those
headers directly instead of assuming availability.  As this conversion
needs to touch large number of source files, the following script is
used as the basis of conversion.
  http://userweb.kernel.org/~tj/misc/slabh-sweep.py
The script does the followings.
* Scan files for gfp and slab usages and update includes such that
  only the necessary includes are there.  ie. if only gfp is used,
  gfp.h, if slab is used, slab.h.
* When the script inserts a new include, it looks at the include
  blocks and try to put the new include such that its order conforms
  to its surrounding.  It's put in the include block which contains
  core kernel includes, in the same order that the rest are ordered -
  alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
  doesn't seem to be any matching order.
* If the script can't find a place to put a new include (mostly
  because the file doesn't have fitting include block), it prints out
  an error message indicating which .h file needs to be added to the
  file.
The conversion was done in the following steps.
1. The initial automatic conversion of all .c files updated slightly
   over 4000 files, deleting around 700 includes and adding ~480 gfp.h
   and ~3000 slab.h inclusions.  The script emitted errors for ~400
   files.
2. Each error was manually checked.  Some didn't need the inclusion,
   some needed manual addition while adding it to implementation .h or
   embedding .c file was more appropriate for others.  This step added
   inclusions to around 150 files.
3. The script was run again and the output was compared to the edits
   from #2 to make sure no file was left behind.
4. Several build tests were done and a couple of problems were fixed.
   e.g. lib/decompress_*.c used malloc/free() wrappers around slab
   APIs requiring slab.h to be added manually.
5. The script was run on all .h files but without automatically
   editing them as sprinkling gfp.h and slab.h inclusions around .h
   files could easily lead to inclusion dependency hell.  Most gfp.h
   inclusion directives were ignored as stuff from gfp.h was usually
   wildly available and often used in preprocessor macros.  Each
   slab.h inclusion directive was examined and added manually as
   necessary.
6. percpu.h was updated not to include slab.h.
7. Build test were done on the following configurations and failures
   were fixed.  CONFIG_GCOV_KERNEL was turned off for all tests (as my
   distributed build env didn't work with gcov compiles) and a few
   more options had to be turned off depending on archs to make things
   build (like ipr on powerpc/64 which failed due to missing writeq).
   * x86 and x86_64 UP and SMP allmodconfig and a custom test config.
   * powerpc and powerpc64 SMP allmodconfig
   * sparc and sparc64 SMP allmodconfig
   * ia64 SMP allmodconfig
   * s390 SMP allmodconfig
   * alpha SMP allmodconfig
   * um on x86_64 SMP allmodconfig
8. percpu.h modifications were reverted so that it could be applied as
   a separate patch and serve as bisection point.
Given the fact that I had only a couple of failures from tests on step
6, I'm fairly confident about the coverage of this conversion patch.
If there is a breakage, it's likely to be something in one of the arch
headers which should be easily discoverable easily on most builds of
the specific arch.
Signed-off-by: Tejun Heo <tj@kernel.org>
Guess-its-ok-by: Christoph Lameter <cl@linux-foundation.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
											 
										 
										
											2010-03-24 17:04:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/slab.h> 
  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  <linux/pagemap.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/ctype.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/utsname.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/mempool.h> 
  
						 
					
						
							
								
									
										
										
										
											2005-04-28 22:41:07 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/delay.h> 
  
						 
					
						
							
								
									
										
										
										
											2005-08-18 09:37:34 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/completion.h> 
  
						 
					
						
							
								
									
										
										
										
											2007-04-03 19:16:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/kthread.h> 
  
						 
					
						
							
								
									
										
										
										
											2005-10-10 10:57:19 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/pagevec.h> 
  
						 
					
						
							
								
									
										
										
										
											2006-12-06 20:34:23 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/freezer.h> 
  
						 
					
						
							
								
									
										
										
										
											2009-04-21 19:31:05 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/namei.h> 
  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  <asm/uaccess.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <asm/processor.h> 
  
						 
					
						
							
								
									
										
										
										
											2009-06-02 06:55:20 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/inet.h> 
  
						 
					
						
							
								
									
										
										
										
											2011-07-01 14:23:34 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/module.h> 
  
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <keys/user-type.h> 
  
						 
					
						
							
								
									
										
										
										
											2009-01-30 21:24:41 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <net/ipv6.h> 
  
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/parser.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  "cifspdu.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "cifsglob.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "cifsproto.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "cifs_unicode.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "cifs_debug.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "cifs_fs_sb.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "ntlmssp.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "nterr.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "rfc1002pdu.h" 
  
						 
					
						
							
								
									
										
										
										
											2010-07-05 18:12:15 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "fscache.h" 
  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define CIFS_PORT 445 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define RFC1001_PORT 139 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								extern  mempool_t  * cifs_req_poolp ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/* FIXME: should these be tunable? */  
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# define TLINK_ERROR_EXPIRE	(1 * HZ) 
  
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# define TLINK_IDLE_EXPIRE	(600 * HZ) 
  
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								enum  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Mount options that take no arguments */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_user_xattr ,  Opt_nouser_xattr , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_forceuid ,  Opt_noforceuid , 
							 
						 
					
						
							
								
									
										
										
										
											2012-10-03 16:02:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Opt_forcegid ,  Opt_noforcegid , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Opt_noblocksend ,  Opt_noautotune , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_hard ,  Opt_soft ,  Opt_perm ,  Opt_noperm , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_mapchars ,  Opt_nomapchars ,  Opt_sfu , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_nosfu ,  Opt_nodfs ,  Opt_posixpaths , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_noposixpaths ,  Opt_nounix , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_nocase , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_brl ,  Opt_nobrl , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_forcemandatorylock ,  Opt_setuids , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_nosetuids ,  Opt_dynperm ,  Opt_nodynperm , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_nohard ,  Opt_nosoft , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_nointr ,  Opt_intr , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_nostrictsync ,  Opt_strictsync , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_serverino ,  Opt_noserverino , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_rwpidforward ,  Opt_cifsacl ,  Opt_nocifsacl , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_acl ,  Opt_noacl ,  Opt_locallease , 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-19 15:20:27 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Opt_sign ,  Opt_seal ,  Opt_noac , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Opt_fsc ,  Opt_mfsymlinks , 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-24 07:40:59 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Opt_multiuser ,  Opt_sloppy ,  Opt_nosharesock , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Mount options which take numeric value */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_backupuid ,  Opt_backupgid ,  Opt_uid , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_cruid ,  Opt_gid ,  Opt_file_mode , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_dirmode ,  Opt_port , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_rsize ,  Opt_wsize ,  Opt_actimeo , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Mount options which take string value */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_user ,  Opt_pass ,  Opt_ip , 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-22 08:42:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Opt_domain ,  Opt_srcaddr ,  Opt_iocharset , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Opt_netbiosname ,  Opt_servern , 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-15 12:20:51 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Opt_ver ,  Opt_vers ,  Opt_sec ,  Opt_cache , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Mount options to be ignored */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_ignore , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Options which could be blank */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_blank_pass , 
							 
						 
					
						
							
								
									
										
										
										
											2012-04-10 18:12:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Opt_blank_user , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_blank_ip , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  match_table_t  cifs_mount_option_tokens  =  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_user_xattr ,  " user_xattr "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_nouser_xattr ,  " nouser_xattr "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_forceuid ,  " forceuid "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_noforceuid ,  " noforceuid "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-10-03 16:02:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_forcegid ,  " forcegid "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_noforcegid ,  " noforcegid "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_noblocksend ,  " noblocksend "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_noautotune ,  " noautotune "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_hard ,  " hard "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_soft ,  " soft "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_perm ,  " perm "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_noperm ,  " noperm "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_mapchars ,  " mapchars "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_nomapchars ,  " nomapchars "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_sfu ,  " sfu "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_nosfu ,  " nosfu "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_nodfs ,  " nodfs "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_posixpaths ,  " posixpaths "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_noposixpaths ,  " noposixpaths "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_nounix ,  " nounix "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_nounix ,  " nolinux "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_nocase ,  " nocase "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_nocase ,  " ignorecase "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_brl ,  " brl "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_nobrl ,  " nobrl "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_nobrl ,  " nolock "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_forcemandatorylock ,  " forcemandatorylock "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-27 20:51:15 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_forcemandatorylock ,  " forcemand "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_setuids ,  " setuids "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_nosetuids ,  " nosetuids "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_dynperm ,  " dynperm "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_nodynperm ,  " nodynperm "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_nohard ,  " nohard "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_nosoft ,  " nosoft "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_nointr ,  " nointr "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_intr ,  " intr "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_nostrictsync ,  " nostrictsync "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_strictsync ,  " strictsync "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_serverino ,  " serverino "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_noserverino ,  " noserverino "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_rwpidforward ,  " rwpidforward "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_cifsacl ,  " cifsacl "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_nocifsacl ,  " nocifsacl "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_acl ,  " acl "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_noacl ,  " noacl "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_locallease ,  " locallease "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_sign ,  " sign "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_seal ,  " seal "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_noac ,  " noac "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_fsc ,  " fsc "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_mfsymlinks ,  " mfsymlinks "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_multiuser ,  " multiuser "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_sloppy ,  " sloppy "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-24 07:40:59 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_nosharesock ,  " nosharesock "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_backupuid ,  " backupuid=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_backupgid ,  " backupgid=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_uid ,  " uid=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_cruid ,  " cruid=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_gid ,  " gid=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_file_mode ,  " file_mode=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_dirmode ,  " dirmode=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_dirmode ,  " dir_mode=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_port ,  " port=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_rsize ,  " rsize=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_wsize ,  " wsize=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_actimeo ,  " actimeo=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-04-10 18:12:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_blank_user ,  " user= "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_blank_user ,  " username= "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_user ,  " user=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_user ,  " username=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_blank_pass ,  " pass= "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-11-29 17:31:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_blank_pass ,  " password= "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_pass ,  " pass=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_pass ,  " password=%s "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-04-10 18:12:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_blank_ip ,  " ip= "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_blank_ip ,  " addr= "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_ip ,  " ip=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ip ,  " addr=%s "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-22 08:42:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_ignore ,  " unc=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ignore ,  " target=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ignore ,  " path=%s "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_domain ,  " dom=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_domain ,  " domain=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_domain ,  " workgroup=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_srcaddr ,  " srcaddr=%s "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-22 08:42:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_ignore ,  " prefixpath=%s "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_iocharset ,  " iocharset=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_netbiosname ,  " netbiosname=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_servern ,  " servern=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ver ,  " ver=%s "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-15 12:20:51 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_vers ,  " vers=%s "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_sec ,  " sec=%s "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-16 07:50:15 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_cache ,  " cache=%s "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ignore ,  " cred "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ignore ,  " credentials "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-02 14:02:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_ignore ,  " cred=%s "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ignore ,  " credentials=%s "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_ignore ,  " guest "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ignore ,  " rw "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ignore ,  " ro "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ignore ,  " suid "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ignore ,  " nosuid "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ignore ,  " exec "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ignore ,  " noexec "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ignore ,  " nodev "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ignore ,  " noauto "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ignore ,  " dev "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ignore ,  " mand "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ignore ,  " nomand "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ignore ,  " _netdev "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_err ,  NULL  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								enum  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_sec_krb5 ,  Opt_sec_krb5i ,  Opt_sec_krb5p , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_sec_ntlmsspi ,  Opt_sec_ntlmssp , 
							 
						 
					
						
							
								
									
										
										
										
											2012-07-23 20:34:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Opt_ntlm ,  Opt_sec_ntlmi ,  Opt_sec_ntlmv2 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_sec_ntlmv2i ,  Opt_sec_lanman , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Opt_sec_none , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_sec_err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  match_table_t  cifs_secflavor_tokens  =  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_sec_krb5 ,  " krb5 "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_sec_krb5i ,  " krb5i "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_sec_krb5p ,  " krb5p "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_sec_ntlmsspi ,  " ntlmsspi "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_sec_ntlmssp ,  " ntlmssp "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_ntlm ,  " ntlm "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_sec_ntlmi ,  " ntlmi "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-07-23 20:34:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_sec_ntlmv2 ,  " nontlm "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_sec_ntlmv2 ,  " ntlmv2 "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Opt_sec_ntlmv2i ,  " ntlmv2i "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_sec_lanman ,  " lanman "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_sec_none ,  " none "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_sec_err ,  NULL  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-16 07:50:15 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/* cache flavors */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								enum  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_cache_loose , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_cache_strict , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_cache_none , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Opt_cache_err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  match_table_t  cifs_cacheflavor_tokens  =  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_cache_loose ,  " loose "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_cache_strict ,  " strict "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_cache_none ,  " none "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Opt_cache_err ,  NULL  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-15 12:20:51 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  match_table_t  cifs_smb_version_tokens  =  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{  Smb_1 ,  SMB1_VERSION_STRING  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-11-28 23:21:06 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Smb_20 ,  SMB20_VERSION_STRING } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-24 18:07:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Smb_21 ,  SMB21_VERSION_STRING  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-10-01 12:26:22 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Smb_30 ,  SMB30_VERSION_STRING  } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-12 22:48:41 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{  Smb_302 ,  SMB302_VERSION_STRING  } , 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-15 12:20:51 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  ip_connect ( struct  TCP_Server_Info  * server ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  generic_ip_connect ( struct  TCP_Server_Info  * server ) ;  
						 
					
						
							
								
									
										
										
										
											2010-10-28 11:16:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  tlink_rb_insert ( struct  rb_root  * root ,  struct  tcon_link  * new_tlink ) ;  
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  cifs_prune_tlinks ( struct  work_struct  * work ) ;  
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:10:39 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  cifs_setup_volume_info ( struct  smb_vol  * volume_info ,  char  * mount_data ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													const  char  * devname ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:42:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  cifs  tcp  session  reconnection 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  mark  tcp  session  as  reconnecting  so  temporarily  locked 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  mark  all  smb  sessions  as  reconnecting  for  tcp  session 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  reconnect  tcp  session 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  wake  up  waiters  on  reconnection ?  -  ( not  needed  currently ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-23 16:18:00 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								cifs_reconnect ( struct  TCP_Server_Info  * server )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-15 11:12:47 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  list_head  * tmp ,  * tmp2 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  cifs_ses  * ses ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  cifs_tcon  * tcon ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-10 01:16:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  mid_q_entry  * mid_entry ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-22 07:09:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  list_head  retry_list ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									spin_lock ( & GlobalMid_Lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-10-16 18:46:39 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( server - > tcpStatus  = =  CifsExiting )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-10 01:16:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* the demux thread will exit normally
 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										next  time  through  the  loop  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										spin_unlock ( & GlobalMid_Lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										server - > tcpStatus  =  CifsNeedReconnect ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_unlock ( & GlobalMid_Lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									server - > maxBuf  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-27 16:23:34 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_CIFS_SMB2 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									server - > max_read  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " Reconnecting tcp session \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* before reconnecting the tcp session, mark the smb session (uid)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										and  the  tid  bad  so  they  are  not  used  until  reconnected  */ 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " %s: marking sessions and tcons for reconnect \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:53:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									list_for_each ( tmp ,  & server - > smb_ses_list )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ses  =  list_entry ( tmp ,  struct  cifs_ses ,  smb_ses_list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:53:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ses - > need_reconnect  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ses - > ipc_tid  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-15 11:12:47 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										list_for_each ( tmp2 ,  & ses - > tcon_list )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											tcon  =  list_entry ( tmp2 ,  struct  cifs_tcon ,  tcon_list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-13 19:45:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											tcon - > need_reconnect  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-11 07:24:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									/* do not want to be sending data on a socket we are freeing */ 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " %s: tearing down socket \n " ,  __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 07:09:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									mutex_lock ( & server - > srv_mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-10 01:16:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( server - > ssocket )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " State: 0x%x Flags: 0x%lx \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 server - > ssocket - > state ,  server - > ssocket - > flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-11-12 18:10:39 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										kernel_sock_shutdown ( server - > ssocket ,  SHUT_WR ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Post shutdown state: 0x%x Flags: 0x%lx \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 server - > ssocket - > state ,  server - > ssocket - > flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										sock_release ( server - > ssocket ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										server - > ssocket  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-13 18:15:00 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									server - > sequence_number  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									server - > session_estab  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-21 06:42:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kfree ( server - > session_key . response ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									server - > session_key . response  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									server - > session_key . len  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-20 18:06:34 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									server - > lstrp  =  jiffies ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-11 07:24:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									mutex_unlock ( & server - > srv_mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-11 07:24:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* mark submitted MIDs for retry and issue callback */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-22 07:09:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									INIT_LIST_HEAD ( & retry_list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " %s: moving mids to private list \n " ,  __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									spin_lock ( & GlobalMid_Lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-11 07:24:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									list_for_each_safe ( tmp ,  tmp2 ,  & server - > pending_mid_q )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mid_entry  =  list_entry ( tmp ,  struct  mid_q_entry ,  qhead ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:28:03 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( mid_entry - > mid_state  = =  MID_REQUEST_SUBMITTED ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											mid_entry - > mid_state  =  MID_RETRY_NEEDED ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-22 07:09:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										list_move ( & mid_entry - > qhead ,  & retry_list ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_unlock ( & GlobalMid_Lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " %s: issuing mid callbacks \n " ,  __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-22 07:09:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									list_for_each_safe ( tmp ,  tmp2 ,  & retry_list )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mid_entry  =  list_entry ( tmp ,  struct  mid_q_entry ,  qhead ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-11 07:24:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										list_del_init ( & mid_entry - > qhead ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mid_entry - > callback ( mid_entry ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-06-10 16:14:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									do  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-07-31 22:46:20 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										try_to_freeze ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* we should try only the port we connected to before */ 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-05 08:38:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										mutex_lock ( & server - > srv_mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  generic_ip_connect ( server ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-10 01:16:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( rc )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " reconnect error %d \n " ,  rc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-28 22:41:11 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											msleep ( 3000 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											atomic_inc ( & tcpSesReconnectCount ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											spin_lock ( & GlobalMid_Lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-10-16 18:46:39 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( server - > tcpStatus  ! =  CifsExiting ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-12 01:01:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												server - > tcpStatus  =  CifsNeedNegotiate ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-10 01:16:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											spin_unlock ( & GlobalMid_Lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-05 08:38:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										mutex_unlock ( & server - > srv_mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-10 16:14:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  while  ( server - > tcpStatus  = =  CifsNeedReconnect ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-11 07:24:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-11 07:24:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_echo_request ( struct  work_struct  * work )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  TCP_Server_Info  * server  =  container_of ( work , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													struct  TCP_Server_Info ,  echo . work ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-04 17:09:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 14:47:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  We  cannot  send  an  echo  if  it  is  disabled  or  until  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  NEGOTIATE_PROTOCOL  request  is  done ,  which  is  indicated  by 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  server - > ops - > need_neg ( )  = =  true .  Also ,  no  need  to  ping  if 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  we  got  a  response  recently . 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-04 17:09:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 10:43:58 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! server - > ops - > need_neg  | |  server - > ops - > need_neg ( server )  | | 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 14:47:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									    ( server - > ops - > can_echo  & &  ! server - > ops - > can_echo ( server ) )  | | 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-04 17:09:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									    time_before ( jiffies ,  server - > lstrp  +  SMB_ECHO_INTERVAL  -  HZ ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-11 07:24:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  requeue_echo ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 14:47:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  server - > ops - > echo  ?  server - > ops - > echo ( server )  :  - ENOSYS ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-11 07:24:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Unable to send echo request to server: %s \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 server - > hostname ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-11 07:24:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								requeue_echo :  
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									queue_delayed_work ( cifsiod_wq ,  & server - > echo ,  SMB_ECHO_INTERVAL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-11 07:24:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:40 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  bool  
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								allocate_buffers ( struct  TCP_Server_Info  * server )  
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:40 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! server - > bigbuf )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										server - > bigbuf  =  ( char  * ) cifs_buf_get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! server - > bigbuf )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( VFS ,  " No memory for large SMB response \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:40 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											msleep ( 3000 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* retry will check if exiting */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( server - > large_buf )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:40 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* we are reusing a dirty large buf, clear its start */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-17 12:45:31 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										memset ( server - > bigbuf ,  0 ,  HEADER_SIZE ( server ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:40 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! server - > smallbuf )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										server - > smallbuf  =  ( char  * ) cifs_small_buf_get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! server - > smallbuf )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( VFS ,  " No memory for SMB response \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:40 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											msleep ( 1000 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* retry will check if exiting */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* beginning of smb buffer is cleared in our buf_get */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* if existing small buf clear beginning */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-17 12:45:31 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										memset ( server - > smallbuf ,  0 ,  HEADER_SIZE ( server ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:40 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  bool  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								server_unresponsive ( struct  TCP_Server_Info  * server )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2012-02-21 16:50:23 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  We  need  to  wait  2  echo  intervals  to  make  sure  we  handle  such 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  situations  right : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  1 s   client  sends  a  normal  SMB  request 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  2 s   client  gets  a  response 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  30 s  echo  workqueue  job  pops ,  and  decides  we  got  a  response  recently 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *      and  don ' t  need  to  send  another 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  . . . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  65 s  kernel_recvmsg  times  out ,  and  we  see  that  we  haven ' t  gotten 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *      a  response  in  > 60 s . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( server - > tcpStatus  = =  CifsGood  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    time_after ( jiffies ,  server - > lstrp  +  2  *  SMB_ECHO_INTERVAL ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( VFS ,  " Server %s has not responded in %d seconds. Reconnecting... \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 server - > hostname ,  ( 2  *  SMB_ECHO_INTERVAL )  /  HZ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_reconnect ( server ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										wake_up ( & server - > response_q ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:28:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  kvec_array_init  -  clone  a  kvec  array ,  and  advance  into  it 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ new : 	pointer  to  memory  for  cloned  array 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ iov : 	pointer  to  original  array 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ nr_segs : 	number  of  members  in  original  array 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ bytes : 	number  of  bytes  to  advance  into  the  cloned  array 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  This  function  will  copy  the  array  provided  in  iov  to  a  section  of  memory 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  and  advance  the  specified  number  of  bytes  into  the  new  array .  It  returns 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  the  number  of  segments  in  the  new  array .  " new "  must  be  at  least  as  big  as 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  the  original  iov  array . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  unsigned  int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								kvec_array_init ( struct  kvec  * new ,  struct  kvec  * iov ,  unsigned  int  nr_segs ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										size_t  bytes ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									size_t  base  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( bytes  | |  ! iov - > iov_len )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  copy  =  min ( bytes ,  iov - > iov_len ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bytes  - =  copy ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										base  + =  copy ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( iov - > iov_len  = =  base )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											iov + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nr_segs - - ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											base  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									memcpy ( new ,  iov ,  sizeof ( * iov )  *  nr_segs ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									new - > iov_base  + =  base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									new - > iov_len  - =  base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nr_segs ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:28:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  struct  kvec  *  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								get_server_iovec ( struct  TCP_Server_Info  * server ,  unsigned  int  nr_segs )  
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:41 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:28:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  kvec  * new_iov ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( server - > iov  & &  nr_segs  < =  server - > nr_iov ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  server - > iov ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* not big enough -- allocate a new one and release the old */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									new_iov  =  kmalloc ( sizeof ( * new_iov )  *  nr_segs ,  GFP_NOFS ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( new_iov )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										kfree ( server - > iov ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										server - > iov  =  new_iov ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										server - > nr_iov  =  nr_segs ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  new_iov ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:30:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_readv_from_socket ( struct  TCP_Server_Info  * server ,  struct  kvec  * iov_orig ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										       unsigned  int  nr_segs ,  unsigned  int  to_read ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:41 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  length  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  total_read ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:28:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  segs ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  msghdr  smb_msg ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:28:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  kvec  * iov ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:28:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									iov  =  get_server_iovec ( server ,  nr_segs ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:28:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! iov ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - ENOMEM ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:41 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									smb_msg . msg_control  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									smb_msg . msg_controllen  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( total_read  =  0 ;  to_read ;  total_read  + =  length ,  to_read  - =  length )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-01 20:22:41 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										try_to_freeze ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( server_unresponsive ( server ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-10 09:55:52 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											total_read  =  - ECONNABORTED ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:28:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										segs  =  kvec_array_init ( iov ,  iov_orig ,  nr_segs ,  total_read ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										length  =  kernel_recvmsg ( server - > ssocket ,  & smb_msg , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													iov ,  segs ,  to_read ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:41 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( server - > tcpStatus  = =  CifsExiting )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											total_read  =  - ESHUTDOWN ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:41 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( server - > tcpStatus  = =  CifsNeedReconnect )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											cifs_reconnect ( server ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-10 09:55:52 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											total_read  =  - ECONNABORTED ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:41 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( length  = =  - ERESTARTSYS  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											   length  = =  - EAGAIN  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											   length  = =  - EINTR )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  Minimum  sleep  to  prevent  looping ,  allowing  socket 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  to  clear  and  app  threads  to  set  tcpStatus 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  CifsNeedReconnect  if  server  hung . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											usleep_range ( 1000 ,  2000 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											length  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:41 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( length  < =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " Received no data or error: expecting %d \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												 " got %d " ,  to_read ,  length ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:41 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_reconnect ( server ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-10 09:55:52 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											total_read  =  - ECONNABORTED ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:41 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  total_read ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:41 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:30:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_read_from_socket ( struct  TCP_Server_Info  * server ,  char  * buf ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										      unsigned  int  to_read ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:28:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  kvec  iov ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									iov . iov_base  =  buf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									iov . iov_len  =  to_read ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:30:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  cifs_readv_from_socket ( server ,  & iov ,  1 ,  to_read ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:41 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  bool  
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								is_smb_response ( struct  TCP_Server_Info  * server ,  unsigned  char  type )  
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  The  first  byte  big  endian  of  the  length  field , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  is  actually  not  part  of  the  length  but  the  type 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  with  the  most  common ,  zero ,  as  regular  data . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  ( type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  RFC1002_SESSION_MESSAGE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* Regular SMB response */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  RFC1002_SESSION_KEEP_ALIVE : 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " RFC 1002 session keep alive \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  RFC1002_POSITIVE_SESSION_RESPONSE : 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " RFC 1002 positive session response \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  RFC1002_NEGATIVE_SESSION_RESPONSE : 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  We  get  this  from  Windows  98  instead  of  an  error  on 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  SMB  negprot  response . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " RFC 1002 negative session response \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* give server a second to clean up */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										msleep ( 1000 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Always  try  445  first  on  reconnect  since  we  get  NACK 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  on  some  if  we  ever  connected  to  port  139  ( the  NACK 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  is  since  we  do  not  begin  with  RFC1001  session 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  initialize  frame ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_set_port ( ( struct  sockaddr  * ) & server - > dstaddr ,  CIFS_PORT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_reconnect ( server ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										wake_up ( & server - > response_q ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( VFS ,  " RFC 1002 unknown response type 0x%x \n " ,  type ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_reconnect ( server ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:30:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								dequeue_mid ( struct  mid_q_entry  * mid ,  bool  malformed )  
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:43 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_CIFS_STATS2 
  
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									mid - > when_received  =  jiffies ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:43 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock ( & GlobalMid_Lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! malformed ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:28:03 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										mid - > mid_state  =  MID_RESPONSE_RECEIVED ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:28:03 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										mid - > mid_state  =  MID_RESPONSE_MALFORMED ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									list_del_init ( & mid - > qhead ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:43 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock ( & GlobalMid_Lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:43 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								handle_mid ( struct  mid_q_entry  * mid ,  struct  TCP_Server_Info  * server ,  
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:28:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									   char  * buf ,  int  malformed ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2012-05-23 14:31:03 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( server - > ops - > check_trans2  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    server - > ops - > check_trans2 ( mid ,  server ,  buf ,  malformed ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									mid - > resp_buf  =  buf ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:28:03 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									mid - > large_buf  =  server - > large_buf ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Was previous buf put in mpx struct for multi-rsp? */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! mid - > multiRsp )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* smb buffer will be freed by user thread */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( server - > large_buf ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											server - > bigbuf  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											server - > smallbuf  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dequeue_mid ( mid ,  malformed ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:43 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:44 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  clean_demultiplex_info ( struct  TCP_Server_Info  * server )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  length ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* take it off the list, if it's not already */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_lock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									list_del_init ( & server - > tcp_ses_list ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_lock ( & GlobalMid_Lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									server - > tcpStatus  =  CifsExiting ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_unlock ( & GlobalMid_Lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									wake_up_all ( & server - > response_q ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-02-06 15:59:18 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* check if we have blocked requests that need to free */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-02-17 17:09:12 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock ( & server - > req_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-02-06 15:59:18 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( server - > credits  < =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										server - > credits  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-02-17 17:09:12 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock ( & server - > req_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:44 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Although  there  should  not  be  any  requests  blocked  on  this  queue  it 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  can  not  hurt  to  be  paranoid  and  try  to  wake  up  requests  that  may 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  haven  been  blocked  when  more  than  50  at  time  were  on  the  wire  to  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  same  server  -  they  now  will  see  the  session  is  in  exit  state  and  get 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  out  of  SendReceive . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									wake_up_all ( & server - > request_q ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* give those requests time to exit */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									msleep ( 125 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( server - > ssocket )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sock_release ( server - > ssocket ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										server - > ssocket  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! list_empty ( & server - > pending_mid_q ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  list_head  dispose_list ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  mid_q_entry  * mid_entry ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  list_head  * tmp ,  * tmp2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										INIT_LIST_HEAD ( & dispose_list ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										spin_lock ( & GlobalMid_Lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										list_for_each_safe ( tmp ,  tmp2 ,  & server - > pending_mid_q )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											mid_entry  =  list_entry ( tmp ,  struct  mid_q_entry ,  qhead ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " Clearing mid 0x%llx \n " ,  mid_entry - > mid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:28:03 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											mid_entry - > mid_state  =  MID_SHUTDOWN ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:44 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											list_move ( & mid_entry - > qhead ,  & dispose_list ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										spin_unlock ( & GlobalMid_Lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* now walk dispose list and issue callbacks */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										list_for_each_safe ( tmp ,  tmp2 ,  & dispose_list )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											mid_entry  =  list_entry ( tmp ,  struct  mid_q_entry ,  qhead ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " Callback mid 0x%llx \n " ,  mid_entry - > mid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:44 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											list_del_init ( & mid_entry - > qhead ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											mid_entry - > callback ( mid_entry ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* 1/8th of sec is more than enough time for them to exit */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										msleep ( 125 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! list_empty ( & server - > pending_mid_q ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  mpx  threads  have  not  exited  yet  give  them  at  least  the  smb 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  send  timeout  time  for  long  ops . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  Due  to  delays  on  oplock  break  requests ,  we  need  to  wait  at 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  least  45  seconds  before  giving  up  on  a  request  getting  a 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  response  and  going  ahead  and  killing  cifsd . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Wait for exit from demultiplex thread \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:44 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										msleep ( 46000 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  If  threads  still  have  not  exited  they  are  probably  never 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  coming  home  not  much  else  we  can  do  but  free  the  memory . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									kfree ( server - > hostname ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:28:27 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kfree ( server - > iov ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:44 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kfree ( server ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									length  =  atomic_dec_return ( & tcpSesAllocCount ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( length  >  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mempool_resize ( cifs_req_poolp ,  length  +  cifs_min_rcv , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								standard_receive3 ( struct  TCP_Server_Info  * server ,  struct  mid_q_entry  * mid )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  length ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									char  * buf  =  server - > smallbuf ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:28:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  pdu_length  =  get_rfc1002_length ( buf ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* make sure this will fit in a large buffer */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-17 12:45:31 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( pdu_length  >  CIFSMaxBufSize  +  MAX_HEADER_SIZE ( server )  -  4 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( VFS ,  " SMB response too long (%u bytes) \n " ,  pdu_length ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_reconnect ( server ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										wake_up ( & server - > response_q ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-10 09:55:52 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  - ECONNABORTED ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* switch to large buffer if too big for a small one */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( pdu_length  >  MAX_CIFS_SMALL_BUFFER_SIZE  -  4 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										server - > large_buf  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:28:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										memcpy ( server - > bigbuf ,  buf ,  server - > total_read ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										buf  =  server - > bigbuf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* now read the rest */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-17 12:45:31 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									length  =  cifs_read_from_socket ( server ,  buf  +  HEADER_SIZE ( server )  -  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pdu_length  -  HEADER_SIZE ( server )  +  1  +  4 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( length  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  length ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									server - > total_read  + =  length ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:28:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dump_smb ( buf ,  server - > total_read ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  We  know  that  we  received  enough  to  get  to  the  MID  as  we 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  checked  the  pdu_length  earlier .  Now  check  to  see 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  if  the  rest  of  the  header  is  OK .  We  borrow  the  length 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  var  for  the  rest  of  the  loop  to  avoid  a  new  stack  var . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  48  bytes  is  enough  to  display  the  header  and  a  little  bit 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  into  the  payload  for  debugging  purposes . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-17 13:25:35 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									length  =  server - > ops - > check_message ( buf ,  server - > total_read ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( length  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_dump_mem ( " Bad SMB:  " ,  buf , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											min_t ( unsigned  int ,  server - > total_read ,  48 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-09-18 16:20:33 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( server - > ops - > is_status_pending  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    server - > ops - > is_status_pending ( buf ,  server ,  length ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-02-07 06:31:05 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! mid ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  length ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:28:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									handle_mid ( mid ,  server ,  buf ,  length ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-02-07 06:31:05 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								static  int  
						 
					
						
							
								
									
										
										
										
											2011-06-21 08:51:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								cifs_demultiplex_thread ( void  * p )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  length ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-21 08:51:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  TCP_Server_Info  * server  =  p ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  pdu_length ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									char  * buf  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									struct  task_struct  * task_to_wake  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  mid_q_entry  * mid_entry ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									current - > flags  | =  PF_MEMALLOC ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " Demultiplex PID: %d \n " ,  task_pid_nr ( current ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-08-02 08:00:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									length  =  atomic_inc_return ( & tcpSesAllocCount ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( length  >  1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-30 22:09:15 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										mempool_resize ( cifs_req_poolp ,  length  +  cifs_min_rcv , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GFP_KERNEL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-07-17 04:03:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_freezable ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-10-16 18:46:39 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									while  ( server - > tcpStatus  ! =  CifsExiting )  { 
							 
						 
					
						
							
								
									
										
										
										
											2005-08-30 20:10:14 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( try_to_freeze ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-28 22:41:07 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! allocate_buffers ( server ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:40 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-28 22:41:07 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										server - > large_buf  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										buf  =  server - > smallbuf ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-08-30 21:13:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										pdu_length  =  4 ;  /* enough to get RFC1001 header */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-20 18:06:34 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:30:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										length  =  cifs_read_from_socket ( server ,  buf ,  pdu_length ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( length  <  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										server - > total_read  =  length ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  The  right  amount  was  read  from  socket  -  4  bytes , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  so  we  can  now  interpret  the  length  field . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:28:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										pdu_length  =  get_rfc1002_length ( buf ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-09-22 16:32:06 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " RFC1002 header 0x%x \n " ,  pdu_length ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! is_smb_response ( server ,  buf [ 0 ] ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-10 01:16:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-28 22:41:09 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:28:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* make sure we have enough to get to the MID */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-17 12:45:31 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( pdu_length  <  HEADER_SIZE ( server )  -  1  -  4 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( VFS ,  " SMB response too short (%u bytes) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												 pdu_length ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:28:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_reconnect ( server ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											wake_up ( & server - > response_q ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-28 22:41:09 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:41 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:28:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* read down to the MID */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:30:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										length  =  cifs_read_from_socket ( server ,  buf  +  4 , 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-17 12:45:31 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													       HEADER_SIZE ( server )  -  1  -  4 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:28:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( length  <  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-28 22:41:09 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										server - > total_read  + =  length ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-17 13:25:35 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										mid_entry  =  server - > ops - > find_mid ( server ,  buf ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! mid_entry  | |  ! mid_entry - > receive ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											length  =  standard_receive3 ( server ,  mid_entry ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											length  =  mid_entry - > receive ( server ,  mid_entry ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-10 08:03:50 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( length  <  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-11 06:41:32 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:28:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( server - > large_buf ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											buf  =  server - > bigbuf ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-20 18:06:34 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										server - > lstrp  =  jiffies ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-11 07:24:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( mid_entry  ! =  NULL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! mid_entry - > multiRsp  | |  mid_entry - > multiEnd ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												mid_entry - > callback ( mid_entry ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-28 15:50:10 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( ! server - > ops - > is_oplock_break  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											   ! server - > ops - > is_oplock_break ( buf ,  server ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( VFS ,  " No task to wake, unknown frame received! NumMids %d \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												 atomic_read ( & midCount ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-17 12:45:31 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dump_mem ( " Received Data is:  " ,  buf , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      HEADER_SIZE ( server ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 22:40:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_CIFS_DEBUG2 
  
						 
					
						
							
								
									
										
										
										
											2012-05-28 15:50:10 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( server - > ops - > dump_detail ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												server - > ops - > dump_detail ( buf ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 22:40:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dump_mids ( server ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif  /* CIFS_DEBUG2 */ 
  
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-28 22:41:09 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  /* end while !EXITING */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-24 22:15:02 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* buffer usually freed in free_mid - need to free it here on exit */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:29:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_buf_release ( server - > bigbuf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( server - > smallbuf )  /* no sense logging a debug message if NULL */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_small_buf_release ( server - > smallbuf ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-10-22 13:57:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									task_to_wake  =  xchg ( & server - > tsk ,  NULL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-01 13:19:44 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									clean_demultiplex_info ( server ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-10-22 13:57:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* if server->tsk was NULL then wait for a signal before exiting */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! task_to_wake )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_current_state ( TASK_INTERRUPTIBLE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										while  ( ! signal_pending ( current ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											schedule ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											set_current_state ( TASK_INTERRUPTIBLE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_current_state ( TASK_RUNNING ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 07:09:35 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									module_put_and_exit ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-11-16 22:22:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/* extract the host portion of the UNC string */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  char  *  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								extract_hostname ( const  char  * unc )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  char  * src ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									char  * dst ,  * delim ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  int  len ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* skip double chars at beginning of string */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* BB: check validity of these bytes? */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									src  =  unc  +  2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* delimiter between hostname and sharename is always '\\' now */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									delim  =  strchr ( src ,  ' \\ ' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! delim ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ERR_PTR ( - EINVAL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									len  =  delim  -  src ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dst  =  kmalloc ( ( len  +  1 ) ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( dst  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ERR_PTR ( - ENOMEM ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									memcpy ( dst ,  src ,  len ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dst [ len ]  =  ' \0 ' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  dst ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  get_option_ul ( substring_t  args [ ] ,  unsigned  long  * option )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									char  * string ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									string  =  match_strdup ( args ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( string  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - ENOMEM ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-04-13 14:04:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  kstrtoul ( string ,  0 ,  option ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kfree ( string ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-02-06 01:37:39 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  get_option_uid ( substring_t  args [ ] ,  kuid_t  * result )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  long  value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									kuid_t  uid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  get_option_ul ( args ,  & value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uid  =  make_kuid ( current_user_ns ( ) ,  value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! uid_valid ( uid ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									* result  =  uid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  get_option_gid ( substring_t  args [ ] ,  kgid_t  * result )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  long  value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									kgid_t  gid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  get_option_ul ( args ,  & value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gid  =  make_kgid ( current_user_ns ( ) ,  value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! gid_valid ( gid ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									* result  =  gid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  cifs_parse_security_flavors ( char  * value ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												       struct  smb_vol  * vol ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									substring_t  args [ MAX_OPT_ARGS ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-10 17:12:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  With  mount  options ,  the  last  one  should  win .  Reset  any  existing 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  settings  back  to  default . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol - > sectype  =  Unspecified ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol - > sign  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  ( match_token ( value ,  cifs_secflavor_tokens ,  args ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-12 19:52:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  Opt_sec_krb5p : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_dbg ( VFS ,  " sec=krb5p is not supported! \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  Opt_sec_krb5i : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vol - > sign  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* Fallthrough */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  Opt_sec_krb5 : 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-10 17:12:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vol - > sectype  =  Kerberos ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-12 19:52:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  Opt_sec_ntlmsspi : 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-10 17:12:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vol - > sign  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-12 19:52:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* Fallthrough */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  Opt_sec_ntlmssp : 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-10 17:12:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vol - > sectype  =  RawNTLMSSP ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-12 19:52:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  Opt_sec_ntlmi : 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-10 17:12:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vol - > sign  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-12 19:52:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* Fallthrough */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  Opt_ntlm : 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-10 17:12:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vol - > sectype  =  NTLM ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-12 19:52:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  Opt_sec_ntlmv2i : 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-10 17:12:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vol - > sign  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-12 19:52:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* Fallthrough */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-07-23 20:34:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  Opt_sec_ntlmv2 : 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-10 17:12:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vol - > sectype  =  NTLMv2 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef CONFIG_CIFS_WEAK_PW_HASH 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  Opt_sec_lanman : 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-10 17:12:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vol - > sectype  =  LANMAN ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  Opt_sec_none : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vol - > nullauth  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( VFS ,  " bad security option: %s \n " ,  value ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-16 07:50:15 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_parse_cache_flavor ( char  * value ,  struct  smb_vol  * vol )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									substring_t  args [ MAX_OPT_ARGS ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( match_token ( value ,  cifs_cacheflavor_tokens ,  args ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  Opt_cache_loose : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vol - > direct_io  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vol - > strict_io  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  Opt_cache_strict : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vol - > direct_io  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vol - > strict_io  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  Opt_cache_none : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vol - > direct_io  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vol - > strict_io  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( VFS ,  " bad cache= option: %s \n " ,  value ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-16 07:50:15 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-15 12:20:51 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_parse_smb_version ( char  * value ,  struct  smb_vol  * vol )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									substring_t  args [ MAX_OPT_ARGS ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( match_token ( value ,  cifs_smb_version_tokens ,  args ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  Smb_1 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vol - > ops  =  & smb1_operations ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vol - > vals  =  & smb1_values ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-24 18:07:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_CIFS_SMB2 
  
						 
					
						
							
								
									
										
										
										
											2012-11-28 23:21:06 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  Smb_20 : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-05 16:11:28 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vol - > ops  =  & smb20_operations ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-11-28 23:21:06 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vol - > vals  =  & smb20_values ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-24 18:07:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  Smb_21 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vol - > ops  =  & smb21_operations ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vol - > vals  =  & smb21_values ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-10-01 12:26:22 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  Smb_30 : 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-08 22:08:06 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vol - > ops  =  & smb30_operations ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-10-01 12:26:22 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vol - > vals  =  & smb30_values ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-12 22:48:41 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  Smb_302 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vol - > ops  =  & smb30_operations ;  /* currently identical with 3.0 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vol - > vals  =  & smb302_values ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-24 18:07:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2012-05-15 12:20:51 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( VFS ,  " Unknown vers= option specified: %s \n " ,  value ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-15 12:20:51 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-10 06:10:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Parse  a  devname  into  substrings  and  populate  the  vol - > UNC  and  vol - > prepath 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  fields  with  the  result .  Returns  0  on  success  and  an  error  otherwise . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_parse_devname ( const  char  * devname ,  struct  smb_vol  * vol )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									char  * pos ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  char  * delims  =  " / \\ " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									size_t  len ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* make sure we have a valid UNC double delimiter prefix */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									len  =  strspn ( devname ,  delims ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( len  ! =  2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* find delimiter between host and sharename */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pos  =  strpbrk ( devname  +  2 ,  delims ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! pos ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* skip past delimiter */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									+ + pos ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* now go until next delimiter or end of string */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									len  =  strcspn ( pos ,  delims ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* move "pos" up to delimiter or NULL */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pos  + =  len ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol - > UNC  =  kstrndup ( devname ,  pos  -  devname ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! vol - > UNC ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - ENOMEM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									convert_delimiter ( vol - > UNC ,  ' \\ ' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* If pos is NULL, or is a bogus trailing delimiter then no prepath */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! * pos + +  | |  ! * pos ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol - > prepath  =  kstrdup ( pos ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! vol - > prepath ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - ENOMEM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								static  int  
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								cifs_parse_mount_options ( const  char  * mountdata ,  const  char  * devname ,  
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											 struct  smb_vol  * vol ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									char  * data ,  * end ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-06 11:33:12 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									char  * mountdata_copy  =  NULL ,  * options ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									unsigned  int   temp_len ,  i ,  j ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									char  separator [ 2 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-31 06:56:09 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									short  int  override_uid  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									short  int  override_gid  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  uid_specified  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  gid_specified  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  sloppy  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									char  * invalid  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-22 15:31:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									char  * nodename  =  utsname ( ) - > nodename ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									char  * string  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									char  * tmp_end ,  * value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									char  delim ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-11-26 11:09:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  got_ip  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  short  port  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  sockaddr  * dstaddr  =  ( struct  sockaddr  * ) & vol - > dstaddr ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									separator [ 0 ]  =  ' , ' ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									separator [ 1 ]  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									delim  =  separator [ 0 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-11-26 11:09:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* ensure we always start with zeroed-out smb_vol */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									memset ( vol ,  0 ,  sizeof ( * vol ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-11-22 15:31:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  does  not  have  to  be  perfect  mapping  since  field  is 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  informational ,  only  used  for  servers  that  do  not  support 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  port  445  and  it  can  be  overridden  at  mount  time 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 11:30:28 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									memset ( vol - > source_rfc1001_name ,  0x20 ,  RFC1001_NAME_LEN ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( i  =  0 ;  i  <  strnlen ( nodename ,  RFC1001_NAME_LEN ) ;  i + + ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-22 15:31:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										vol - > source_rfc1001_name [ i ]  =  toupper ( nodename [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 11:30:28 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									vol - > source_rfc1001_name [ RFC1001_NAME_LEN ]  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-08-22 21:38:31 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* null target name indicates to use *SMBSERVR default called name
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   if  we  end  up  sending  RFC1001  session  initialize  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol - > target_rfc1001_name [ 0 ]  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-19 18:00:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									vol - > cred_uid  =  current_uid ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol - > linux_uid  =  current_uid ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 10:38:47 +11:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									vol - > linux_gid  =  current_gid ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-26 16:28:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* default to only allowing write access to owner of the mount */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol - > dir_mode  =  vol - > file_mode  =  S_IRUGO  |  S_IXUGO  |  S_IWUSR ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */ 
							 
						 
					
						
							
								
									
										
										
										
											2005-06-22 17:26:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* default is always to request posix paths. */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol - > posix_paths  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-27 15:40:47 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* default to using server inode numbers where available */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol - > server_ino  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-06-22 17:26:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-09-19 15:20:27 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* default is to use strict cifs caching semantics */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol - > strict_io  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-01 14:42:28 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									vol - > actimeo  =  CIFS_DEF_ACTIMEO ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-15 12:20:51 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* FIXME: add autonegotiation -- for now, SMB1 is default */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol - > ops  =  & smb1_operations ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol - > vals  =  & smb1_values ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! mountdata ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									mountdata_copy  =  kstrndup ( mountdata ,  PAGE_SIZE ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! mountdata_copy ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									options  =  mountdata_copy ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-14 22:00:56 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									end  =  options  +  strlen ( options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( strncmp ( options ,  " sep= " ,  4 )  = =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-10 01:16:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( options [ 4 ]  ! =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											separator [ 0 ]  =  options [ 4 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											options  + =  5 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " Null separator not allowed \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-26 09:56:44 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									vol - > backupuid_specified  =  false ;  /* no backup intent for a user */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol - > backupgid_specified  =  false ;  /* no backup intent for a group */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-24 07:40:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  ( cifs_parse_devname ( devname ,  vol ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  0 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  - ENOMEM : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_dbg ( VFS ,  " Unable to allocate memory for devname. \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  - EINVAL : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_dbg ( VFS ,  " Malformed UNC in devname. \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_dbg ( VFS ,  " Unknown error parsing devname. \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-10 06:10:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									while  ( ( data  =  strsep ( & options ,  separator ) )  ! =  NULL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										substring_t  args [ MAX_OPT_ARGS ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										unsigned  long  option ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  token ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  ( ! * data ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										token  =  match_token ( data ,  cifs_mount_option_tokens ,  args ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										switch  ( token )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* Ingnore the following */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_ignore : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* Boolean values */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_user_xattr : 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											vol - > no_xattr  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_nouser_xattr : 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											vol - > no_xattr  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_forceuid : 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-31 06:56:09 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											override_uid  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_noforceuid : 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-31 06:56:09 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											override_uid  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-10-03 16:02:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  Opt_forcegid : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											override_gid  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_noforcegid : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											override_gid  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  Opt_noblocksend : 
							 
						 
					
						
							
								
									
										
										
										
											2008-10-29 00:47:57 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > noblocksnd  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_noautotune : 
							 
						 
					
						
							
								
									
										
										
										
											2008-10-29 00:47:57 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > noautotune  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_hard : 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											vol - > retry  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_soft : 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											vol - > retry  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_perm : 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											vol - > noperm  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_noperm : 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											vol - > noperm  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_mapchars : 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-28 22:41:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > remap  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_nomapchars : 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-28 22:41:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > remap  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_sfu : 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > sfu_emul  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_nosfu : 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > sfu_emul  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_nodfs : 
							 
						 
					
						
							
								
									
										
										
										
											2008-10-16 18:35:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > nodfs  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_posixpaths : 
							 
						 
					
						
							
								
									
										
										
										
											2005-06-22 17:26:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > posix_paths  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_noposixpaths : 
							 
						 
					
						
							
								
									
										
										
										
											2005-06-22 17:26:35 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > posix_paths  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_nounix : 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-18 23:21:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > no_linux_ext  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_nocase : 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > nocase  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_brl : 
							 
						 
					
						
							
								
									
										
										
										
											2005-08-18 20:49:57 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > nobrl  =   0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_nobrl : 
							 
						 
					
						
							
								
									
										
										
										
											2005-08-18 20:49:57 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > nobrl  =   1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-27 20:51:15 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  turn  off  mandatory  locking  in  mode 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											 *  if  remote  locking  is  turned  off  since  the 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-27 20:51:15 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											 *  local  vfs  will  do  advisory 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( vol - > file_mode  = = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												( S_IALLUGO  &  ~ ( S_ISUID  |  S_IXGRP ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-08-19 11:04:29 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												vol - > file_mode  =  S_IALLUGO ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_forcemandatorylock : 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-02 17:24:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > mand_lock  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_setuids : 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											vol - > setuids  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_nosetuids : 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											vol - > setuids  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_dynperm : 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-12 22:23:49 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > dynperm  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_nodynperm : 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-12 22:23:49 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > dynperm  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_nohard : 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											vol - > retry  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_nosoft : 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											vol - > retry  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_nointr : 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											vol - > intr  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_intr : 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											vol - > intr  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_nostrictsync : 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 15:21:59 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > nostrictsync  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_strictsync : 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 15:21:59 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > nostrictsync  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_serverino : 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											vol - > server_ino  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_noserverino : 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											vol - > server_ino  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_rwpidforward : 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-26 06:02:00 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > rwpidforward  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_cifsacl : 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-12 15:44:21 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > cifs_acl  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_nocifsacl : 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-12 15:44:21 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > cifs_acl  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_acl : 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											vol - > no_psx_acl  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_noacl : 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											vol - > no_psx_acl  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_locallease : 
							 
						 
					
						
							
								
									
										
										
										
											2008-10-23 04:42:37 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > local_lease  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_sign : 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-10 17:12:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > sign  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_seal : 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-15 16:44:38 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/* we do not do the following in secFlags because seal
 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											 *  is  a  per  tree  connection  ( mount )  not  a  per  socket 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  or  per - smb  connection  option  in  the  protocol 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  vol - > secFlg  | =  CIFSSEC_MUST_SEAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-15 16:44:38 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > seal  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_noac : 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											printk ( KERN_WARNING  " CIFS: Mount option noac not  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												" supported. Instead set  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												" /proc/fs/cifs/LookupCacheEnabled to 0 \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_fsc : 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-24 17:49:05 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifndef CONFIG_CIFS_FSCACHE 
  
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( VFS ,  " FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-24 17:49:05 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2010-07-05 18:13:36 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > fsc  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_mfsymlinks : 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-30 14:56:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > mfsymlinks  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_multiuser : 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vol - > multiuser  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  Opt_sloppy : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											sloppy  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-24 07:40:59 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  Opt_nosharesock : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vol - > nosharesock  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* Numeric Values */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_backupuid : 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-06 01:37:39 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( get_option_uid ( args ,  & vol - > backupuid ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( VFS ,  " %s: Invalid backupuid value \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													 __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-26 09:56:44 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vol - > backupuid_specified  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_backupgid : 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-06 01:37:39 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( get_option_gid ( args ,  & vol - > backupgid ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( VFS ,  " %s: Invalid backupgid value \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													 __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-26 09:56:44 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vol - > backupgid_specified  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_uid : 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-06 01:37:39 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( get_option_uid ( args ,  & vol - > linux_uid ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( VFS ,  " %s: Invalid uid value \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													 __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											uid_specified  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_cruid : 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-06 01:37:39 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( get_option_uid ( args ,  & vol - > cred_uid ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( VFS ,  " %s: Invalid cruid value \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													 __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_gid : 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-06 01:37:39 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( get_option_gid ( args ,  & vol - > linux_gid ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( VFS ,  " %s: Invalid gid value \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													 __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											gid_specified  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_file_mode : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( get_option_ul ( args ,  & option ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( VFS ,  " %s: Invalid file_mode value \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													 __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vol - > file_mode  =  option ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_dirmode : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( get_option_ul ( args ,  & option ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( VFS ,  " %s: Invalid dir_mode value \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													 __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vol - > dir_mode  =  option ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_port : 
							 
						 
					
						
							
								
									
										
										
										
											2012-11-26 11:09:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( get_option_ul ( args ,  & option )  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											    option  >  USHRT_MAX )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( VFS ,  " %s: Invalid port value \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													 __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2012-11-26 11:09:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											port  =  ( unsigned  short ) option ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_rsize : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( get_option_ul ( args ,  & option ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( VFS ,  " %s: Invalid rsize value \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													 __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vol - > rsize  =  option ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_wsize : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( get_option_ul ( args ,  & option ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( VFS ,  " %s: Invalid wsize value \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													 __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vol - > wsize  =  option ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_actimeo : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( get_option_ul ( args ,  & option ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( VFS ,  " %s: Invalid actimeo value \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													 __func__ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vol - > actimeo  =  HZ  *  option ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( vol - > actimeo  >  CIFS_MAX_ACTIMEO )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( VFS ,  " attribute cache timeout too large \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* String Arguments */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-04-10 18:12:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  Opt_blank_user : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* null user, ie. anonymous authentication */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vol - > nullauth  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vol - > username  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  Opt_user : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											string  =  match_strdup ( args ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( string  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  out_nomem ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-09 08:47:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( strnlen ( string ,  CIFS_MAX_USERNAME_LEN )  > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															CIFS_MAX_USERNAME_LEN )  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												printk ( KERN_WARNING  " CIFS: username too long \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vol - > username  =  kstrdup ( string ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! vol - > username ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_blank_pass : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* passwords have to be handled differently
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  to  allow  the  character  used  for  deliminator 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  to  be  passed  within  them 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-04-09 18:17:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  Check  if  this  is  a  case  where  the   password 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  starts  with  a  delimiter 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tmp_end  =  strchr ( data ,  ' = ' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tmp_end + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! ( tmp_end  <  end  & &  tmp_end [ 1 ]  = =  delim ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												/* No it is not. Set the password to NULL */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vol - > password  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* Yes it is. Drop down to Opt_pass below.*/ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_pass : 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/* Obtain the value string */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											value  =  strchr ( data ,  ' = ' ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-28 18:07:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											value + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* Set tmp_end to end of the string */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tmp_end  =  ( char  * )  value  +  strlen ( value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* Check if following character is the deliminator
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  If  yes ,  we  have  encountered  a  double  deliminator 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  reset  the  NULL  character  to  the  deliminator 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-12 07:15:50 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( tmp_end  <  end  & &  tmp_end [ 1 ]  = =  delim )  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tmp_end [ 0 ]  =  delim ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-12 07:15:50 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												/* Keep iterating until we get to a single
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												 *  deliminator  OR  the  end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												while  ( ( tmp_end  =  strchr ( tmp_end ,  delim ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													! =  NULL  & &  ( tmp_end [ 1 ]  = =  delim ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														tmp_end  =  ( char  * )  & tmp_end [ 2 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												/* Reset var options to point to next element */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( tmp_end )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													tmp_end [ 0 ]  =  ' \0 ' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													options  =  ( char  * )  & tmp_end [ 1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													/* Reached the end of the mount option
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													 *  string  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													options  =  end ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* Now build new password string */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											temp_len  =  strlen ( value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vol - > password  =  kzalloc ( temp_len + 1 ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( vol - > password  = =  NULL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												printk ( KERN_WARNING  " CIFS: no memory  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														    " for password \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( i  =  0 ,  j  =  0 ;  i  <  temp_len ;  i + + ,  j + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vol - > password [ j ]  =  value [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ( value [ i ]  = =  delim )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												     value [ i + 1 ]  = =  delim ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													/* skip the second deliminator */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													i + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vol - > password [ j ]  =  ' \0 ' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-04-10 18:12:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  Opt_blank_ip : 
							 
						 
					
						
							
								
									
										
										
										
											2012-11-26 11:09:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/* FIXME: should this be an error instead? */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											got_ip  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-04-10 18:12:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  Opt_ip : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											string  =  match_strdup ( args ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( string  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  out_nomem ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-11-26 11:09:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! cifs_convert_address ( dstaddr ,  string , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													strlen ( string ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												printk ( KERN_ERR  " CIFS: bad ip= option (%s). \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													string ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2012-11-26 11:09:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											got_ip  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_domain : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											string  =  match_strdup ( args ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( string  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  out_nomem ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-19 09:01:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( strnlen ( string ,  CIFS_MAX_DOMAINNAME_LEN ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													= =  CIFS_MAX_DOMAINNAME_LEN )  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												printk ( KERN_WARNING  " CIFS: domain name too " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														    "  long \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											vol - > domainname  =  kstrdup ( string ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! vol - > domainname )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												printk ( KERN_WARNING  " CIFS: no memory  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														    " for domainname \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " Domain name set \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_srcaddr : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											string  =  match_strdup ( args ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( string  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  out_nomem ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-04-10 18:12:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! cifs_convert_address ( 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													( struct  sockaddr  * ) & vol - > srcaddr , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													string ,  strlen ( string ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												printk ( KERN_WARNING  " CIFS:  Could not parse " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														    "  srcaddr: %s \n " ,  string ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_iocharset : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											string  =  match_strdup ( args ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( string  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  out_nomem ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-04-10 18:12:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( strnlen ( string ,  1024 )  > =  65 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												printk ( KERN_WARNING  " CIFS: iocharset name  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														    " too long. \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 if  ( strnicmp ( string ,  " default " ,  7 )  ! =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vol - > iocharset  =  kstrdup ( string , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															 GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ! vol - > iocharset )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													printk ( KERN_WARNING  " CIFS: no memory " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															    " for charset \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* if iocharset not set then load_nls_default
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  is  used  by  caller 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 */ 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											 cifs_dbg ( FYI ,  " iocharset set to %s \n " ,  string ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_netbiosname : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											string  =  match_strdup ( args ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( string  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  out_nomem ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											memset ( vol - > source_rfc1001_name ,  0x20 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												RFC1001_NAME_LEN ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  FIXME :  are  there  cases  in  which  a  comma  can 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  be  valid  in  workstation  netbios  name  ( and 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  need  special  handling ) ? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( i  =  0 ;  i  <  RFC1001_NAME_LEN ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												/* don't ucase netbiosname for user */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( string [ i ]  = =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vol - > source_rfc1001_name [ i ]  =  string [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* The string has 16th byte zero still from
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  set  at  top  of  the  function 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( i  = =  RFC1001_NAME_LEN  & &  string [ i ]  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												printk ( KERN_WARNING  " CIFS: netbiosname " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												       "  longer than 15 truncated. \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_servern : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* servernetbiosname specified override *SMBSERVER */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											string  =  match_strdup ( args ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( string  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  out_nomem ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* last byte, type, is 0x20 for servr type */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											memset ( vol - > target_rfc1001_name ,  0x20 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												RFC1001_NAME_LEN_WITH_NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* BB are there cases in which a comma can be
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											   valid  in  this  workstation  netbios  name 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											   ( and  need  special  handling ) ?  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* user or mount helper must uppercase the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											   netbios  name  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( i  =  0 ;  i  <  15 ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( string [ i ]  = =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												vol - > target_rfc1001_name [ i ]  =  string [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* The string has 16th byte zero still from
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											   set  at  top  of  the  function   */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( i  = =  RFC1001_NAME_LEN  & &  string [ i ]  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												printk ( KERN_WARNING  " CIFS: server net " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												       " biosname longer than 15 truncated. \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  Opt_ver : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											string  =  match_strdup ( args ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( string  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  out_nomem ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-15 12:04:03 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( strnicmp ( string ,  " 1 " ,  1 )  = =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												/* This is the default */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* For all other value, error */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											printk ( KERN_WARNING  " CIFS: Invalid version " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													    "  specified \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-15 12:20:51 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  Opt_vers : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											string  =  match_strdup ( args ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( string  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  out_nomem ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( cifs_parse_smb_version ( string ,  vol )  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  Opt_sec : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											string  =  match_strdup ( args ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( string  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  out_nomem ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( cifs_parse_security_flavors ( string ,  vol )  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-16 07:50:15 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  Opt_cache : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											string  =  match_strdup ( args ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( string  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  out_nomem ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( cifs_parse_cache_flavor ( string ,  vol )  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										default : 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  An  option  we  don ' t  recognize .  Save  it  off  for  later 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  if  we  haven ' t  already  found  one 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! invalid ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												invalid  =  data ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* Free up any allocated string */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										kfree ( string ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										string  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! sloppy  & &  invalid )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										printk ( KERN_ERR  " CIFS: Unknown mount option  \" %s \" \n " ,  invalid ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifndef CONFIG_KEYS 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Muliuser mounts require CONFIG_KEYS support */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( vol - > multiuser )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( VFS ,  " Multiuser mounts require kernels with CONFIG_KEYS enabled \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2012-11-25 08:00:42 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! vol - > UNC )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-24 07:40:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( VFS ,  " CIFS mount error: No usable UNC path provided in device string! \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-11-25 08:00:42 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-10 06:10:45 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* make sure UNC has a share name */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! strchr ( vol - > UNC  +  3 ,  ' \\ ' ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( VFS ,  " Malformed UNC. Unable to find share name. \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-10 06:10:45 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-11-26 11:09:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! got_ip )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* No ip= option specified? Try to get it from UNC */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! cifs_convert_address ( dstaddr ,  & vol - > UNC [ 2 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														strlen ( & vol - > UNC [ 2 ] ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											printk ( KERN_ERR  " Unable to determine destination  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													" address. \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  cifs_parse_mount_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* set the port that we got earlier */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cifs_set_port ( dstaddr ,  port ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-07-31 06:56:09 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( uid_specified ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vol - > override_uid  =  override_uid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else  if  ( override_uid  = =  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										printk ( KERN_NOTICE  " CIFS: ignoring forceuid mount option  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												   " specified with no uid= option. \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( gid_specified ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vol - > override_gid  =  override_gid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else  if  ( override_gid  = =  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										printk ( KERN_NOTICE  " CIFS: ignoring forcegid mount option  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												   " specified with no gid= option. \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kfree ( mountdata_copy ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								out_nomem :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									printk ( KERN_WARNING  " Could not allocate temporary buffer \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								cifs_parse_mount_err :  
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kfree ( string ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kfree ( mountdata_copy ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:06:02 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/** Returns true if srcaddr isn't specified and rhs isn't
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  specified ,  or  if  srcaddr  is  specified  and 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  matches  the  IP  address  of  the  rhs  argument . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  bool  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								srcip_matches ( struct  sockaddr  * srcaddr ,  struct  sockaddr  * rhs )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( srcaddr - > sa_family )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  AF_UNSPEC : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ( rhs - > sa_family  = =  AF_UNSPEC ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  AF_INET :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  sockaddr_in  * saddr4  =  ( struct  sockaddr_in  * ) srcaddr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  sockaddr_in  * vaddr4  =  ( struct  sockaddr_in  * ) rhs ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ( saddr4 - > sin_addr . s_addr  = =  vaddr4 - > sin_addr . s_addr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  AF_INET6 :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  sockaddr_in6  * saddr6  =  ( struct  sockaddr_in6  * ) srcaddr ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-16 21:36:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										struct  sockaddr_in6  * vaddr6  =  ( struct  sockaddr_in6  * ) rhs ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:06:02 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  ipv6_addr_equal ( & saddr6 - > sin6_addr ,  & vaddr6 - > sin6_addr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										WARN_ON ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ;  /* don't expect to be here */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 22:18:07 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  If  no  port  is  specified  in  addr  structure ,  we  try  to  match  with  445  port 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  and  if  it  fails  -  with  139  ports .  It  should  be  called  only  if  address 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  families  of  server  and  addr  are  equal . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  bool  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								match_port ( struct  TCP_Server_Info  * server ,  struct  sockaddr  * addr )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-03-13 18:55:55 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									__be16  port ,  * sport ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 22:18:07 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( addr - > sa_family )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  AF_INET : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sport  =  & ( ( struct  sockaddr_in  * )  & server - > dstaddr ) - > sin_port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										port  =  ( ( struct  sockaddr_in  * )  addr ) - > sin_port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  AF_INET6 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sport  =  & ( ( struct  sockaddr_in6  * )  & server - > dstaddr ) - > sin6_port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										port  =  ( ( struct  sockaddr_in6  * )  addr ) - > sin6_port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										WARN_ON ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! port )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										port  =  htons ( CIFS_PORT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( port  = =  * sport ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										port  =  htons ( RFC1001_PORT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  port  = =  * sport ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:06:02 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 20:43:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  bool  
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:06:02 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								match_address ( struct  TCP_Server_Info  * server ,  struct  sockaddr  * addr ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									      struct  sockaddr  * srcaddr ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 20:43:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( addr - > sa_family )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  AF_INET :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  sockaddr_in  * addr4  =  ( struct  sockaddr_in  * ) addr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  sockaddr_in  * srv_addr4  = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													( struct  sockaddr_in  * ) & server - > dstaddr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( addr4 - > sin_addr . s_addr  ! =  srv_addr4 - > sin_addr . s_addr ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 20:43:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  AF_INET6 :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  sockaddr_in6  * addr6  =  ( struct  sockaddr_in6  * ) addr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  sockaddr_in6  * srv_addr6  = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													( struct  sockaddr_in6  * ) & server - > dstaddr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 20:43:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! ipv6_addr_equal ( & addr6 - > sin6_addr , 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												     & srv_addr6 - > sin6_addr ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 20:43:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( addr6 - > sin6_scope_id  ! =  srv_addr6 - > sin6_scope_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 20:43:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										WARN_ON ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ;  /* don't expect to be here */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 20:43:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:06:02 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! srcip_matches ( srcaddr ,  ( struct  sockaddr  * ) & server - > srcaddr ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 20:43:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 20:43:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  bool  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								match_security ( struct  TCP_Server_Info  * server ,  struct  smb_vol  * vol )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-06-12 19:52:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  The  select_sectype  function  should  either  return  the  vol - > sectype 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  that  was  specified ,  or  " Unspecified "  if  that  sectype  was  not 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  compatible  with  the  given  NEGOTIATE  request . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( select_sectype ( server ,  vol - > sectype )  = =  Unspecified ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 20:43:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-12 19:52:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Now  check  if  signing  mode  is  acceptable .  No  need  to  check 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  global_secflags  at  this  point  since  if  MUST_SIGN  is  set  then 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  the  server - > sign  had  better  be  too . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-26 07:01:00 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( vol - > sign  & &  ! server - > sign ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 20:43:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-11-26 11:09:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  match_server ( struct  TCP_Server_Info  * server ,  struct  smb_vol  * vol )  
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2012-11-26 11:09:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  sockaddr  * addr  =  ( struct  sockaddr  * ) & vol - > dstaddr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-24 07:40:59 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( vol - > nosharesock ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-15 12:20:51 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( server - > vals  ! =  vol - > vals )  | |  ( server - > ops  ! =  vol - > ops ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! net_eq ( cifs_net_ns ( server ) ,  current - > nsproxy - > net_ns ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! match_address ( server ,  addr , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											   ( struct  sockaddr  * ) & vol - > srcaddr ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! match_port ( server ,  addr ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! match_security ( server ,  vol ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:44:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  struct  TCP_Server_Info  *  
						 
					
						
							
								
									
										
										
										
											2012-11-26 11:09:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								cifs_find_tcp_session ( struct  smb_vol  * vol )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:44:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  TCP_Server_Info  * server ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 20:43:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									list_for_each_entry ( server ,  & cifs_tcp_ses_list ,  tcp_ses_list )  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-11-26 11:09:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! match_server ( server ,  vol ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 20:43:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:44:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										+ + server - > srv_count ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Existing tcp session with server found \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:44:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  server ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2008-05-09 18:17:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:53:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:44:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								cifs_put_tcp_session ( struct  TCP_Server_Info  * server )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:44:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  task_struct  * task ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-09 18:17:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:44:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( - - server - > srv_count  >  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:44:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-09 18:17:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												Make CIFS mount work in a container.
Teach cifs about network namespaces, so mounting uses adresses/routing
visible from the container rather than from init context.
A container is a chroot on steroids that changes more than just the root
filesystem the new processes see.  One thing containers can isolate is
"network namespaces", meaning each container can have its own set of
ethernet interfaces, each with its own own IP address and routing to the
outside world.  And if you open a socket in _userspace_ from processes
within such a container, this works fine.
But sockets opened from within the kernel still use a single global
networking context in a lot of places, meaning the new socket's address
and routing are correct for PID 1 on the host, but are _not_ what
userspace processes in the container get to use.
So when you mount a network filesystem from within in a container, the
mount code in the CIFS driver uses the host's networking context and not
the container's networking context, so it gets the wrong address, uses
the wrong routing, and may even try to go out an interface that the
container can't even access...  Bad stuff.
This patch copies the mount process's network context into the CIFS
structure that stores the rest of the server information for that mount
point, and changes the socket open code to use the saved network context
instead of the global network context.  I.E. "when you attempt to use
these addresses, do so relative to THIS set of network interfaces and
routing rules, not the old global context from back before we supported
containers".
The big long HOWTO sets up a test environment on the assumption you've
never used ocntainers before.  It basically says:
1) configure and build a new kernel that has container support
2) build a new root filesystem that includes the userspace container
control package (LXC)
3) package/run them under KVM (so you don't have to mess up your host
system in order to play with containers).
4) set up some containers under the KVM system
5) set up contradictory routing in the KVM system and the container so
that the host and the container see different things for the same address
6) try to mount a CIFS share from both contexts so you can both force it
to work and force it to fail.
For a long drawn out test reproduction sequence, see:
  http://landley.livejournal.com/47024.html
  http://landley.livejournal.com/47205.html
  http://landley.livejournal.com/47476.html
Signed-off-by: Rob Landley <rlandley@parallels.com>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
											 
										 
										
											2011-01-22 15:44:05 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									put_net ( cifs_net_ns ( server ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:44:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									list_del_init ( & server - > tcp_ses_list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-06 22:05:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-11 07:24:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cancel_delayed_work_sync ( & server - > echo ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:44:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock ( & GlobalMid_Lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									server - > tcpStatus  =  CifsExiting ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_unlock ( & GlobalMid_Lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-06 22:05:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-21 14:25:08 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_crypto_shash_release ( server ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-05 18:12:15 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_fscache_release_client_cookie ( server ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-21 06:42:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kfree ( server - > session_key . response ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									server - > session_key . response  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									server - > session_key . len  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:44:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									task  =  xchg ( & server - > tsk ,  NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( task ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										force_sig ( SIGKILL ,  task ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  struct  TCP_Server_Info  *  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_get_tcp_session ( struct  smb_vol  * volume_info )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  TCP_Server_Info  * tcp_ses  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " UNC: %s \n " ,  volume_info - > UNC ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* see if we already have a matching tcp_ses */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-11-26 11:09:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tcp_ses  =  cifs_find_tcp_session ( volume_info ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( tcp_ses ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  tcp_ses ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tcp_ses  =  kzalloc ( sizeof ( struct  TCP_Server_Info ) ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! tcp_ses )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  - ENOMEM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  out_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-15 12:20:51 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tcp_ses - > ops  =  volume_info - > ops ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tcp_ses - > vals  =  volume_info - > vals ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												Make CIFS mount work in a container.
Teach cifs about network namespaces, so mounting uses adresses/routing
visible from the container rather than from init context.
A container is a chroot on steroids that changes more than just the root
filesystem the new processes see.  One thing containers can isolate is
"network namespaces", meaning each container can have its own set of
ethernet interfaces, each with its own own IP address and routing to the
outside world.  And if you open a socket in _userspace_ from processes
within such a container, this works fine.
But sockets opened from within the kernel still use a single global
networking context in a lot of places, meaning the new socket's address
and routing are correct for PID 1 on the host, but are _not_ what
userspace processes in the container get to use.
So when you mount a network filesystem from within in a container, the
mount code in the CIFS driver uses the host's networking context and not
the container's networking context, so it gets the wrong address, uses
the wrong routing, and may even try to go out an interface that the
container can't even access...  Bad stuff.
This patch copies the mount process's network context into the CIFS
structure that stores the rest of the server information for that mount
point, and changes the socket open code to use the saved network context
instead of the global network context.  I.E. "when you attempt to use
these addresses, do so relative to THIS set of network interfaces and
routing rules, not the old global context from back before we supported
containers".
The big long HOWTO sets up a test environment on the assumption you've
never used ocntainers before.  It basically says:
1) configure and build a new kernel that has container support
2) build a new root filesystem that includes the userspace container
control package (LXC)
3) package/run them under KVM (so you don't have to mess up your host
system in order to play with containers).
4) set up some containers under the KVM system
5) set up contradictory routing in the KVM system and the container so
that the host and the container see different things for the same address
6) try to mount a CIFS share from both contexts so you can both force it
to work and force it to fail.
For a long drawn out test reproduction sequence, see:
  http://landley.livejournal.com/47024.html
  http://landley.livejournal.com/47205.html
  http://landley.livejournal.com/47476.html
Signed-off-by: Rob Landley <rlandley@parallels.com>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
											 
										 
										
											2011-01-22 15:44:05 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_set_net_ns ( tcp_ses ,  get_net ( current - > nsproxy - > net_ns ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tcp_ses - > hostname  =  extract_hostname ( volume_info - > UNC ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( IS_ERR ( tcp_ses - > hostname ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  PTR_ERR ( tcp_ses - > hostname ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-26 18:10:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  out_err_crypto_release ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tcp_ses - > noblocksnd  =  volume_info - > noblocksnd ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tcp_ses - > noautotune  =  volume_info - > noautotune ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-01 01:28:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tcp_ses - > tcp_nodelay  =  volume_info - > sockopt_tcp_nodelay ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-02-17 17:09:12 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tcp_ses - > in_flight  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-02-06 15:59:18 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tcp_ses - > credits  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									init_waitqueue_head ( & tcp_ses - > response_q ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									init_waitqueue_head ( & tcp_ses - > request_q ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									INIT_LIST_HEAD ( & tcp_ses - > pending_mid_q ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									mutex_init ( & tcp_ses - > srv_mutex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									memcpy ( tcp_ses - > workstation_RFC1001_name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										volume_info - > source_rfc1001_name ,  RFC1001_NAME_LEN_WITH_NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									memcpy ( tcp_ses - > server_RFC1001_name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										volume_info - > target_rfc1001_name ,  RFC1001_NAME_LEN_WITH_NULL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-13 18:15:00 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tcp_ses - > session_estab  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tcp_ses - > sequence_number  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-20 18:06:34 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tcp_ses - > lstrp  =  jiffies ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-01 17:41:16 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock_init ( & tcp_ses - > req_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									INIT_LIST_HEAD ( & tcp_ses - > tcp_ses_list ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									INIT_LIST_HEAD ( & tcp_ses - > smb_ses_list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-11 07:24:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									INIT_DELAYED_WORK ( & tcp_ses - > echo ,  cifs_echo_request ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-11-26 11:09:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									memcpy ( & tcp_ses - > srcaddr ,  & volume_info - > srcaddr , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									       sizeof ( tcp_ses - > srcaddr ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									memcpy ( & tcp_ses - > dstaddr ,  & volume_info - > dstaddr , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sizeof ( tcp_ses - > dstaddr ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-13 00:48:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_CIFS_SMB2 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									get_random_bytes ( tcp_ses - > client_guid ,  SMB2_CLIENT_GUID_SIZE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  at  this  point  we  are  the  only  ones  with  the  pointer 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  to  the  struct  since  the  kernel  thread  not  created  yet 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  no  need  to  spinlock  this  init  of  tcpStatus  or  srv_count 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tcp_ses - > tcpStatus  =  CifsNew ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									+ + tcp_ses - > srv_count ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  ip_connect ( tcp_ses ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( VFS ,  " Error connecting to socket. Aborting operation. \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-26 18:10:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  out_err_crypto_release ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  since  we ' re  in  a  cifs  function  already ,  we  know  that 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  this  will  succeed .  No  need  for  try_module_get ( ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									__module_get ( THIS_MODULE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-21 08:51:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tcp_ses - > tsk  =  kthread_run ( cifs_demultiplex_thread , 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												  tcp_ses ,  " cifsd " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( IS_ERR ( tcp_ses - > tsk ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  PTR_ERR ( tcp_ses - > tsk ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( VFS ,  " error %d create cifsd thread \n " ,  rc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										module_put ( THIS_MODULE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-26 18:10:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  out_err_crypto_release ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-12 01:01:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tcp_ses - > tcpStatus  =  CifsNeedNegotiate ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* thread spawned, put it on the list */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									list_add ( & tcp_ses - > tcp_ses_list ,  & cifs_tcp_ses_list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-05 18:12:15 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_fscache_get_client_cookie ( tcp_ses ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-11 07:24:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* queue echo request delayed work */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									queue_delayed_work ( cifsiod_wq ,  & tcp_ses - > echo ,  SMB_ECHO_INTERVAL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-11 07:24:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  tcp_ses ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-26 18:10:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								out_err_crypto_release :  
						 
					
						
							
								
									
										
										
										
											2010-10-21 14:25:08 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_crypto_shash_release ( tcp_ses ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												Make CIFS mount work in a container.
Teach cifs about network namespaces, so mounting uses adresses/routing
visible from the container rather than from init context.
A container is a chroot on steroids that changes more than just the root
filesystem the new processes see.  One thing containers can isolate is
"network namespaces", meaning each container can have its own set of
ethernet interfaces, each with its own own IP address and routing to the
outside world.  And if you open a socket in _userspace_ from processes
within such a container, this works fine.
But sockets opened from within the kernel still use a single global
networking context in a lot of places, meaning the new socket's address
and routing are correct for PID 1 on the host, but are _not_ what
userspace processes in the container get to use.
So when you mount a network filesystem from within in a container, the
mount code in the CIFS driver uses the host's networking context and not
the container's networking context, so it gets the wrong address, uses
the wrong routing, and may even try to go out an interface that the
container can't even access...  Bad stuff.
This patch copies the mount process's network context into the CIFS
structure that stores the rest of the server information for that mount
point, and changes the socket open code to use the saved network context
instead of the global network context.  I.E. "when you attempt to use
these addresses, do so relative to THIS set of network interfaces and
routing rules, not the old global context from back before we supported
containers".
The big long HOWTO sets up a test environment on the assumption you've
never used ocntainers before.  It basically says:
1) configure and build a new kernel that has container support
2) build a new root filesystem that includes the userspace container
control package (LXC)
3) package/run them under KVM (so you don't have to mess up your host
system in order to play with containers).
4) set up some containers under the KVM system
5) set up contradictory routing in the KVM system and the container so
that the host and the container see different things for the same address
6) try to mount a CIFS share from both contexts so you can both force it
to work and force it to fail.
For a long drawn out test reproduction sequence, see:
  http://landley.livejournal.com/47024.html
  http://landley.livejournal.com/47205.html
  http://landley.livejournal.com/47476.html
Signed-off-by: Rob Landley <rlandley@parallels.com>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
											 
										 
										
											2011-01-22 15:44:05 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									put_net ( cifs_net_ns ( tcp_ses ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								out_err :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( tcp_ses )  { 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-06 18:31:29 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! IS_ERR ( tcp_ses - > hostname ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											kfree ( tcp_ses - > hostname ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( tcp_ses - > ssocket ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											sock_release ( tcp_ses - > ssocket ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										kfree ( tcp_ses ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ERR_PTR ( rc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  match_session ( struct  cifs_ses  * ses ,  struct  smb_vol  * vol )  
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-06-12 19:52:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( vol - > sectype  ! =  Unspecified  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    vol - > sectype  ! =  ses - > sectype ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( ses - > sectype )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  Kerberos : 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-06 02:30:39 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! uid_eq ( vol - > cred_uid ,  ses - > cred_uid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* NULL username means anonymous session */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ses - > user_name  = =  NULL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! vol - > nullauth ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* anything else takes username/password */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( strncmp ( ses - > user_name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											    vol - > username  ?  vol - > username  :  " " , 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-09 08:47:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											    CIFS_MAX_USERNAME_LEN ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-23 06:53:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ( vol - > username  & &  strlen ( vol - > username )  ! =  0 )  & & 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										    ses - > password  ! =  NULL  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										    strncmp ( ses - > password , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											    vol - > password  ?  vol - > password  :  " " , 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-09 08:47:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											    CIFS_MAX_PASSWORD_LEN ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  struct  cifs_ses  *  
						 
					
						
							
								
									
										
										
										
											2010-07-06 20:43:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								cifs_find_smb_ses ( struct  TCP_Server_Info  * server ,  struct  smb_vol  * vol )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  cifs_ses  * ses ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-06 22:05:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 20:43:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									list_for_each_entry ( ses ,  & server - > smb_ses_list ,  smb_ses_list )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-12 10:06:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ses - > status  = =  CifsExiting ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! match_session ( ses ,  vol ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:53:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										+ + ses - > ses_count ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:53:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  ses ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:53:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2008-05-06 22:05:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:53:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								cifs_put_smb_ses ( struct  cifs_ses  * ses )  
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:53:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-10-12 10:06:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  rc ,  xid ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:53:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  TCP_Server_Info  * server  =  ses - > server ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-06 22:05:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " %s: ses_count=%d \n " ,  __func__ ,  ses - > ses_count ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-12 10:06:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-12 10:06:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ses - > status  = =  CifsExiting )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:53:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( - - ses - > ses_count  >  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:53:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-12 10:06:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ses - > status  = =  CifsGood ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ses - > status  =  CifsExiting ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-06 22:05:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-12 10:06:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ses - > status  = =  CifsExiting  & &  server - > ops - > logoff )  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-20 11:21:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										xid  =  get_xid ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-12 10:06:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  server - > ops - > logoff ( xid ,  ses ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											cifs_dbg ( VFS ,  " %s: Session Logoff failure rc=%d \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												__func__ ,  rc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-20 11:21:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_free_xid ( xid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:53:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-12 10:06:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_lock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									list_del_init ( & ses - > smb_ses_list ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-14 13:53:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									sesInfoFree ( ses ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cifs_put_tcp_session ( server ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2008-05-06 22:05:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_KEYS 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-19 09:01:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1) 
  
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* Populate username and pw fields from keyring if possible */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_set_cifscreds ( struct  smb_vol  * vol ,  struct  cifs_ses  * ses )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									char  * desc ,  * delim ,  * payload ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ssize_t  len ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  key  * key ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  TCP_Server_Info  * server  =  ses - > server ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  sockaddr_in  * sa ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  sockaddr_in6  * sa6 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  user_key_payload  * upayload ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									desc  =  kmalloc ( CIFSCREDS_DESC_SIZE ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! desc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - ENOMEM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* try to find an address key first */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( server - > dstaddr . ss_family )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  AF_INET : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sa  =  ( struct  sockaddr_in  * ) & server - > dstaddr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sprintf ( desc ,  " cifs:a:%pI4 " ,  & sa - > sin_addr . s_addr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  AF_INET6 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sa6  =  ( struct  sockaddr_in6  * ) & server - > dstaddr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sprintf ( desc ,  " cifs:a:%pI6c " ,  & sa6 - > sin6_addr . s6_addr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Bad ss_family (%hu) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 server - > dstaddr . ss_family ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  out_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " %s: desc=%s \n " ,  __func__ ,  desc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									key  =  request_key ( & key_type_logon ,  desc ,  " " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( IS_ERR ( key ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! ses - > domainName )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " domainName is NULL \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											rc  =  PTR_ERR ( key ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  out_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* didn't work, try to find a domain key */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sprintf ( desc ,  " cifs:d:%s " ,  ses - > domainName ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " %s: desc=%s \n " ,  __func__ ,  desc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										key  =  request_key ( & key_type_logon ,  desc ,  " " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( IS_ERR ( key ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											rc  =  PTR_ERR ( key ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  out_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									down_read ( & key - > sem ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									upayload  =  key - > payload . data ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( IS_ERR_OR_NULL ( upayload ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-02-07 06:30:51 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  upayload  ?  PTR_ERR ( upayload )  :  - EINVAL ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  out_key_put ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* find first : in payload */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									payload  =  ( char  * ) upayload - > data ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									delim  =  strnchr ( payload ,  upayload - > datalen ,  ' : ' ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " payload=%s \n " ,  payload ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! delim )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Unable to find ':' in payload (datalen=%d) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 upayload - > datalen ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  out_key_put ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									len  =  delim  -  payload ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-09 08:47:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( len  >  CIFS_MAX_USERNAME_LEN  | |  len  < =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Bad value from username search (len=%zd) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 len ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  out_key_put ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol - > username  =  kstrndup ( payload ,  len ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! vol - > username )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Unable to allocate %zd bytes for username \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 len ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  - ENOMEM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  out_key_put ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " %s: username=%s \n " ,  __func__ ,  vol - > username ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									len  =  key - > datalen  -  ( len  +  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-09 08:47:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( len  >  CIFS_MAX_PASSWORD_LEN  | |  len  < =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Bad len for password search (len=%zd) \n " ,  len ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  - EINVAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										kfree ( vol - > username ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vol - > username  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  out_key_put ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									+ + delim ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol - > password  =  kstrndup ( delim ,  len ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! vol - > password )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Unable to allocate %zd bytes for password \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 len ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  - ENOMEM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										kfree ( vol - > username ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										vol - > username  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  out_key_put ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								out_key_put :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									up_read ( & key - > sem ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									key_put ( key ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								out_err :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									kfree ( desc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " %s: returning %d \n " ,  __func__ ,  rc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# else  /* ! CONFIG_KEYS */ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  inline  int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_set_cifscreds ( struct  smb_vol  * vol  __attribute__ ( ( unused ) ) ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   struct  cifs_ses  * ses  __attribute__ ( ( unused ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  - ENOSYS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif  /* CONFIG_KEYS */ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  struct  cifs_ses  *  
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								cifs_get_smb_ses ( struct  TCP_Server_Info  * server ,  struct  smb_vol  * volume_info )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2012-05-25 10:43:58 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc  =  - ENOMEM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  int  xid ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  cifs_ses  * ses ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  sockaddr_in  * addr  =  ( struct  sockaddr_in  * ) & server - > dstaddr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  sockaddr_in6  * addr6  =  ( struct  sockaddr_in6  * ) & server - > dstaddr ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-20 11:21:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									xid  =  get_xid ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 20:43:02 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ses  =  cifs_find_smb_ses ( server ,  volume_info ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ses )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Existing smb sess found (status=%d) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 ses - > status ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mutex_lock ( & ses - > session_mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  cifs_negotiate_protocol ( xid ,  ses ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( rc )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											mutex_unlock ( & ses - > session_mutex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* problem -- put our ses reference */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											cifs_put_smb_ses ( ses ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-20 11:21:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											free_xid ( xid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  ERR_PTR ( rc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ses - > need_reconnect )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " Session needs reconnect \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											rc  =  cifs_setup_session ( xid ,  ses , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														volume_info - > local_nls ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( rc )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												mutex_unlock ( & ses - > session_mutex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												/* problem -- put our reference */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												cifs_put_smb_ses ( ses ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-20 11:21:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												free_xid ( xid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  ERR_PTR ( rc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mutex_unlock ( & ses - > session_mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-14 11:38:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* existing SMB ses has a server reference already */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_put_tcp_session ( server ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-20 11:21:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										free_xid ( xid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  ses ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " Existing smb sess not found \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ses  =  sesInfoAlloc ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ses  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  get_ses_fail ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* new SMB session uses our server ref */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ses - > server  =  server ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( server - > dstaddr . ss_family  = =  AF_INET6 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sprintf ( ses - > serverName ,  " %pI6 " ,  & addr6 - > sin6_addr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										sprintf ( ses - > serverName ,  " %pI4 " ,  & addr - > sin_addr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-25 01:11:56 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( volume_info - > username )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ses - > user_name  =  kstrdup ( volume_info - > username ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! ses - > user_name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  get_ses_fail ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* volume_info->password freed at unmount */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( volume_info - > password )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ses - > password  =  kstrdup ( volume_info - > password ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! ses - > password ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  get_ses_fail ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( volume_info - > domainname )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-28 09:53:07 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ses - > domainName  =  kstrdup ( volume_info - > domainname ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! ses - > domainName ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  get_ses_fail ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-19 18:00:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ses - > cred_uid  =  volume_info - > cred_uid ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ses - > linux_uid  =  volume_info - > linux_uid ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-12 01:24:57 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-26 07:01:00 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ses - > sectype  =  volume_info - > sectype ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ses - > sign  =  volume_info - > sign ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									mutex_lock ( & ses - > session_mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  cifs_negotiate_protocol ( xid ,  ses ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  cifs_setup_session ( xid ,  ses ,  volume_info - > local_nls ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									mutex_unlock ( & ses - > session_mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-08 21:10:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  get_ses_fail ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* success, put it on the list */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									list_add ( & ses - > smb_ses_list ,  & server - > smb_ses_list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-20 11:21:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									free_xid ( xid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  ses ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								get_ses_fail :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									sesInfoFree ( ses ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-20 11:21:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									free_xid ( xid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  ERR_PTR ( rc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  match_tcon ( struct  cifs_tcon  * tcon ,  const  char  * unc )  
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( tcon - > tidStatus  = =  CifsExiting ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( strncmp ( tcon - > treeName ,  unc ,  MAX_TREE_SIZE ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  struct  cifs_tcon  *  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_find_tcon ( struct  cifs_ses  * ses ,  const  char  * unc )  
						 
					
						
							
								
									
										
										
										
											2008-11-15 11:12:47 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  list_head  * tmp ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  cifs_tcon  * tcon ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-15 11:12:47 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-15 11:12:47 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									list_for_each ( tmp ,  & ses - > tcon_list )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tcon  =  list_entry ( tmp ,  struct  cifs_tcon ,  tcon_list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:11 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! match_tcon ( tcon ,  unc ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-15 11:12:47 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										+ + tcon - > tc_count ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-05-06 22:05:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  tcon ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-15 11:12:47 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								cifs_put_tcon ( struct  cifs_tcon  * tcon )  
						 
					
						
							
								
									
										
										
										
											2008-11-15 11:12:47 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2012-05-25 11:11:39 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  xid ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  cifs_ses  * ses  =  tcon - > ses ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-15 11:12:47 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " %s: tc_count=%d \n " ,  __func__ ,  tcon - > tc_count ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-15 11:12:47 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( - - tcon - > tc_count  >  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-15 11:12:47 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									list_del_init ( & tcon - > tcon_list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-15 11:12:47 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-20 11:21:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									xid  =  get_xid ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 11:11:39 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ses - > server - > ops - > tree_disconnect ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ses - > server - > ops - > tree_disconnect ( xid ,  tcon ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-20 11:21:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_free_xid ( xid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-15 11:12:47 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-05 18:12:27 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_fscache_release_super_cookie ( tcon ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-23 20:37:53 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tconInfoFree ( tcon ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-15 11:12:47 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_put_smb_ses ( ses ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  struct  cifs_tcon  *  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_get_tcon ( struct  cifs_ses  * ses ,  struct  smb_vol  * volume_info )  
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc ,  xid ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  cifs_tcon  * tcon ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tcon  =  cifs_find_tcon ( ses ,  volume_info - > UNC ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( tcon )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Found match on UNC path \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* existing tcon already has a reference */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_put_smb_ses ( ses ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( tcon - > seal  ! =  volume_info - > seal ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( VFS ,  " transport encryption setting conflicts with existing tid \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  tcon ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 11:11:39 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! ses - > server - > ops - > tree_connect )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  - ENOSYS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  out_fail ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tcon  =  tconInfoAlloc ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( tcon  = =  NULL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  - ENOMEM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  out_fail ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tcon - > ses  =  ses ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( volume_info - > password )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tcon - > password  =  kstrdup ( volume_info - > password ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! tcon - > password )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											rc  =  - ENOMEM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  out_fail ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 11:11:39 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  BB  Do  we  need  to  wrap  session_mutex  around  this  TCon  call  and  Unix 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  SetFS  as  we  do  on  SessSetup  and  reconnect ? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-20 11:21:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									xid  =  get_xid ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 11:11:39 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  ses - > server - > ops - > tree_connect ( xid ,  ses ,  volume_info - > UNC ,  tcon , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													    volume_info - > local_nls ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-20 11:21:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									free_xid ( xid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " Tcon rc = %d \n " ,  rc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  out_fail ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( volume_info - > nodfs )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tcon - > Flags  & =  ~ SMB_SHARE_IS_IN_DFS ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " DFS disabled (%d) \n " ,  tcon - > Flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tcon - > seal  =  volume_info - > seal ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 11:11:39 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  We  can  have  only  one  retry  value  for  a  connection  to  a  share  so  for 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  resources  mounted  more  than  once  to  the  same  server  share  the  last 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  value  passed  in  for  the  retry  flag  is  used . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tcon - > retry  =  volume_info - > retry ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tcon - > nocase  =  volume_info - > nocase ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tcon - > local_lease  =  volume_info - > local_lease ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-19 06:22:45 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									INIT_LIST_HEAD ( & tcon - > pending_opens ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									list_add ( & tcon - > tcon_list ,  & ses - > tcon_list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-05 18:12:27 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_fscache_get_super_cookie ( tcon ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  tcon ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								out_fail :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tconInfoFree ( tcon ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ERR_PTR ( rc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_put_tlink ( struct  tcon_link  * tlink )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! tlink  | |  IS_ERR ( tlink ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! atomic_dec_and_test ( & tlink - > tl_count )  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    test_bit ( TCON_LINK_IN_TREE ,  & tlink - > tl_flags ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tlink - > tl_time  =  jiffies ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! IS_ERR ( tlink_tcon ( tlink ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_put_tcon ( tlink_tcon ( tlink ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									kfree ( tlink ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-26 23:35:47 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  inline  struct  tcon_link  *  
						 
					
						
							
								
									
										
										
										
											2011-06-09 12:58:53 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								cifs_sb_master_tlink ( struct  cifs_sb_info  * cifs_sb )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  cifs_sb - > master_tlink ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2011-05-26 23:35:47 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								compare_mount_options ( struct  super_block  * sb ,  struct  cifs_mnt_data  * mnt_data )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  cifs_sb_info  * old  =  CIFS_SB ( sb ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  cifs_sb_info  * new  =  mnt_data - > cifs_sb ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ( sb - > s_flags  &  CIFS_MS_MASK )  ! =  ( mnt_data - > flags  &  CIFS_MS_MASK ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ( old - > mnt_cifs_flags  &  CIFS_MOUNT_MASK )  ! = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    ( new - > mnt_cifs_flags  &  CIFS_MOUNT_MASK ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:30:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  We  want  to  share  sb  only  if  we  don ' t  specify  an  r / wsize  or 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  specified  r / wsize  is  greater  than  or  equal  to  existing  one . 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-26 23:35:47 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( new - > wsize  & &  new - > wsize  <  old - > wsize ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:30:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( new - > rsize  & &  new - > rsize  <  old - > rsize ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-02-06 01:20:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! uid_eq ( old - > mnt_uid ,  new - > mnt_uid )  | |  ! gid_eq ( old - > mnt_gid ,  new - > mnt_gid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-26 23:35:47 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( old - > mnt_file_mode  ! =  new - > mnt_file_mode  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    old - > mnt_dir_mode  ! =  new - > mnt_dir_mode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( strcmp ( old - > local_nls - > charset ,  new - > local_nls - > charset ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( old - > actimeo  ! =  new - > actimeo ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_match_super ( struct  super_block  * sb ,  void  * data )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  cifs_mnt_data  * mnt_data  =  ( struct  cifs_mnt_data  * ) data ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  smb_vol  * volume_info ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  cifs_sb_info  * cifs_sb ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  TCP_Server_Info  * tcp_srv ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  cifs_ses  * ses ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  cifs_tcon  * tcon ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-26 23:35:47 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  tcon_link  * tlink ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_lock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cifs_sb  =  CIFS_SB ( sb ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tlink  =  cifs_get_tlink ( cifs_sb_master_tlink ( cifs_sb ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( IS_ERR ( tlink ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tcon  =  tlink_tcon ( tlink ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ses  =  tcon - > ses ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tcp_srv  =  ses - > server ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									volume_info  =  mnt_data - > vol ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-11-26 11:09:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! match_server ( tcp_srv ,  volume_info )  | | 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-26 23:35:47 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									    ! match_session ( ses ,  volume_info )  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    ! match_tcon ( tcon ,  volume_info - > UNC ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  compare_mount_options ( sb ,  mnt_data ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								out :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-11 10:16:34 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_put_tlink ( tlink ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-26 23:35:47 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								int  
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:21:53 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								get_dfs_path ( const  unsigned  int  xid ,  struct  cifs_ses  * ses ,  const  char  * old_path ,  
						 
					
						
							
								
									
										
										
										
											2012-05-25 11:11:39 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									     const  struct  nls_table  * nls_codepage ,  unsigned  int  * num_referrals , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									     struct  dfs_info3_param  * * referrals ,  int  remap ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									char  * temp_unc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:21:53 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! ses - > server - > ops - > tree_connect  | |  ! ses - > server - > ops - > get_dfs_refer ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 11:11:39 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  - ENOSYS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									* num_referrals  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									* referrals  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 11:11:39 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ses - > ipc_tid  = =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										temp_unc  =  kmalloc ( 2  /* for slashes */  + 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 11:11:39 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											strnlen ( ses - > serverName ,  SERVER_NAME_LEN_WITH_NULL  *  2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												+  1  +  4  /* slash IPC$ */  +  2 ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  ( temp_unc  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  - ENOMEM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										temp_unc [ 0 ]  =  ' \\ ' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										temp_unc [ 1 ]  =  ' \\ ' ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 11:11:39 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										strcpy ( temp_unc  +  2 ,  ses - > serverName ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										strcpy ( temp_unc  +  2  +  strlen ( ses - > serverName ) ,  " \\ IPC$ " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  ses - > server - > ops - > tree_connect ( xid ,  ses ,  temp_unc ,  NULL , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														    nls_codepage ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Tcon rc = %d ipc_tid = %d \n " ,  rc ,  ses - > ipc_tid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										kfree ( temp_unc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc  = =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:21:53 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  ses - > server - > ops - > get_dfs_refer ( xid ,  ses ,  old_path , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														     referrals ,  num_referrals , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														     nls_codepage ,  remap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 11:11:39 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  BB  -  map  targetUNCs  to  dfs_info3  structures ,  here  or  in 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:21:53 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  ses - > server - > ops - > get_dfs_refer . 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 11:11:39 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-07-23 10:11:19 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_DEBUG_LOCK_ALLOC 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  struct  lock_class_key  cifs_key [ 2 ] ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  struct  lock_class_key  cifs_slock_key [ 2 ] ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  inline  void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_reclassify_socket4 ( struct  socket  * sock )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  sock  * sk  =  sock - > sk ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BUG_ON ( sock_owned_by_user ( sk ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									sock_lock_init_class_and_name ( sk ,  " slock-AF_INET-CIFS " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& cifs_slock_key [ 0 ] ,  " sk_lock-AF_INET-CIFS " ,  & cifs_key [ 0 ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  inline  void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_reclassify_socket6 ( struct  socket  * sock )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  sock  * sk  =  sock - > sk ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BUG_ON ( sock_owned_by_user ( sk ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									sock_lock_init_class_and_name ( sk ,  " slock-AF_INET6-CIFS " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& cifs_slock_key [ 1 ] ,  " sk_lock-AF_INET6-CIFS " ,  & cifs_key [ 1 ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  inline  void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_reclassify_socket4 ( struct  socket  * sock )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  inline  void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_reclassify_socket6 ( struct  socket  * sock )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/* See RFC1001 section 14 on representation of Netbios names */  
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  rfc1002mangle ( char  * target ,  char  * source ,  unsigned  int  length )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  i ,  j ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( i  =  0 ,  j  =  0 ;  i  <  ( length ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										/* mask a nibble at a time and encode */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										target [ j ]  =  ' A '  +  ( 0x0F  &  ( source [ i ]  > >  4 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										target [ j + 1 ]  =  ' A '  +  ( 0x0F  &  source [ i ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										j  + =  2 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:06:02 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								bind_socket ( struct  TCP_Server_Info  * server )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( server - > srcaddr . ss_family  ! =  AF_UNSPEC )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* Bind to the specified local IP address */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										struct  socket  * socket  =  server - > ssocket ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  socket - > ops - > bind ( socket , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												       ( struct  sockaddr  * )  & server - > srcaddr , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												       sizeof ( server - > srcaddr ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( rc  <  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											struct  sockaddr_in  * saddr4 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											struct  sockaddr_in6  * saddr6 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											saddr4  =  ( struct  sockaddr_in  * ) & server - > srcaddr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											saddr6  =  ( struct  sockaddr_in6  * ) & server - > srcaddr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( saddr6 - > sin6_family  = =  AF_INET6 ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( VFS ,  " Failed to bind to: %pI6c, error: %d \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													 & saddr6 - > sin6_addr ,  rc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:06:02 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											else 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( VFS ,  " Failed to bind to: %pI4, error: %d \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													 & saddr4 - > sin_addr . s_addr ,  rc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:06:02 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								ip_rfc1001_connect ( struct  TCP_Server_Info  * server )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  some  servers  require  RFC1001  sessinit  before  sending 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  negprot  -  BB  check  reconnection  in  case  where  second 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  sessinit  is  sent  but  no  second  negprot 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  rfc1002_session_packet  * ses_init_buf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  smb_hdr  * smb_buf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ses_init_buf  =  kzalloc ( sizeof ( struct  rfc1002_session_packet ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											       GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ses_init_buf )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ses_init_buf - > trailer . session_req . called_len  =  32 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( server - > server_RFC1001_name  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										    server - > server_RFC1001_name [ 0 ]  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											rfc1002mangle ( ses_init_buf - > trailer . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      session_req . called_name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      server - > server_RFC1001_name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      RFC1001_NAME_LEN_WITH_NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											rfc1002mangle ( ses_init_buf - > trailer . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      session_req . called_name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      DEFAULT_CIFS_CALLED_NAME , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      RFC1001_NAME_LEN_WITH_NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ses_init_buf - > trailer . session_req . calling_len  =  32 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  calling  name  ends  in  null  ( byte  16 )  from  old  smb 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  convention . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( server - > workstation_RFC1001_name  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										    server - > workstation_RFC1001_name [ 0 ]  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											rfc1002mangle ( ses_init_buf - > trailer . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      session_req . calling_name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      server - > workstation_RFC1001_name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      RFC1001_NAME_LEN_WITH_NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											rfc1002mangle ( ses_init_buf - > trailer . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      session_req . calling_name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      " LINUX_CIFS_CLNT " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      RFC1001_NAME_LEN_WITH_NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ses_init_buf - > trailer . session_req . scope1  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ses_init_buf - > trailer . session_req . scope2  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										smb_buf  =  ( struct  smb_hdr  * ) ses_init_buf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* sizeof RFC1002_SESSION_REQUEST with no scope */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-29 05:40:20 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										smb_buf - > smb_buf_length  =  cpu_to_be32 ( 0x81000044 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  smb_send ( server ,  smb_buf ,  0x44 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										kfree ( ses_init_buf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  RFC1001  layer  in  at  least  one  server 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  requires  very  short  break  before  negprot 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  presumably  because  not  expecting  negprot 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  to  follow  so  fast .   This  is  a  simple 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  solution  that  works  without 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  complicating  the  code  and  causes  no 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  significant  slowing  down  on  mount 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  for  everyone  else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										usleep_range ( 1000 ,  2000 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  else  the  negprot  may  still  work  without  this 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  even  though  malloc  failed 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								generic_ip_connect ( struct  TCP_Server_Info  * server )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-03-13 18:55:55 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									__be16  sport ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  slen ,  sfamily ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:42:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  socket  * socket  =  server - > ssocket ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  sockaddr  * saddr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									saddr  =  ( struct  sockaddr  * )  & server - > dstaddr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( server - > dstaddr . ss_family  = =  AF_INET6 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sport  =  ( ( struct  sockaddr_in6  * )  saddr ) - > sin6_port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										slen  =  sizeof ( struct  sockaddr_in6 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sfamily  =  AF_INET6 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sport  =  ( ( struct  sockaddr_in  * )  saddr ) - > sin_port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										slen  =  sizeof ( struct  sockaddr_in ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sfamily  =  AF_INET ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:42:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( socket  = =  NULL )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												Make CIFS mount work in a container.
Teach cifs about network namespaces, so mounting uses adresses/routing
visible from the container rather than from init context.
A container is a chroot on steroids that changes more than just the root
filesystem the new processes see.  One thing containers can isolate is
"network namespaces", meaning each container can have its own set of
ethernet interfaces, each with its own own IP address and routing to the
outside world.  And if you open a socket in _userspace_ from processes
within such a container, this works fine.
But sockets opened from within the kernel still use a single global
networking context in a lot of places, meaning the new socket's address
and routing are correct for PID 1 on the host, but are _not_ what
userspace processes in the container get to use.
So when you mount a network filesystem from within in a container, the
mount code in the CIFS driver uses the host's networking context and not
the container's networking context, so it gets the wrong address, uses
the wrong routing, and may even try to go out an interface that the
container can't even access...  Bad stuff.
This patch copies the mount process's network context into the CIFS
structure that stores the rest of the server information for that mount
point, and changes the socket open code to use the saved network context
instead of the global network context.  I.E. "when you attempt to use
these addresses, do so relative to THIS set of network interfaces and
routing rules, not the old global context from back before we supported
containers".
The big long HOWTO sets up a test environment on the assumption you've
never used ocntainers before.  It basically says:
1) configure and build a new kernel that has container support
2) build a new root filesystem that includes the userspace container
control package (LXC)
3) package/run them under KVM (so you don't have to mess up your host
system in order to play with containers).
4) set up some containers under the KVM system
5) set up contradictory routing in the KVM system and the container so
that the host and the container see different things for the same address
6) try to mount a CIFS share from both contexts so you can both force it
to work and force it to fail.
For a long drawn out test reproduction sequence, see:
  http://landley.livejournal.com/47024.html
  http://landley.livejournal.com/47205.html
  http://landley.livejournal.com/47476.html
Signed-off-by: Rob Landley <rlandley@parallels.com>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
											 
										 
										
											2011-01-22 15:44:05 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  __sock_create ( cifs_net_ns ( server ) ,  sfamily ,  SOCK_STREAM , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												   IPPROTO_TCP ,  & socket ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  ( rc  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( VFS ,  " Error %d creating socket \n " ,  rc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											server - > ssocket  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:42:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* BB other socket options to set KEEPALIVE, NODELAY? */ 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Socket created \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:42:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										server - > ssocket  =  socket ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										socket - > sk - > sk_allocation  =  GFP_NOFS ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( sfamily  = =  AF_INET6 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											cifs_reclassify_socket6 ( socket ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											cifs_reclassify_socket4 ( socket ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:06:02 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  bind_socket ( server ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:42:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Eventually  check  for  other  socket  options  to  change  from 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  the  default .  sock_setsockopt  not  used  because  it  expects 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  user  space  buffer 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:42:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									socket - > sk - > sk_rcvtimeo  =  7  *  HZ ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-01-19 03:49:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									socket - > sk - > sk_sndtimeo  =  5  *  HZ ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-10-29 00:47:57 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-10-10 14:21:15 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* make the bufsizes depend on wsize/rsize and max requests */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:42:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( server - > noautotune )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( socket - > sk - > sk_sndbuf  <  ( 200  *  1024 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											socket - > sk - > sk_sndbuf  =  200  *  1024 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( socket - > sk - > sk_rcvbuf  <  ( 140  *  1024 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											socket - > sk - > sk_rcvbuf  =  140  *  1024 ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-10-29 00:47:57 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-01-01 01:28:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( server - > tcp_nodelay )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  val  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-01 01:28:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  kernel_setsockopt ( socket ,  SOL_TCP ,  TCP_NODELAY , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												( char  * ) & val ,  sizeof ( val ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( rc ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " set TCP_NODELAY socket option error %d \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												 rc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-01 01:28:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " sndbuf %d rcvbuf %d rcvtimeo 0x%lx \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:42:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										 socket - > sk - > sk_sndbuf , 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-21 03:50:45 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										 socket - > sk - > sk_rcvbuf ,  socket - > sk - > sk_rcvtimeo ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:42:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-06-21 07:18:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  socket - > ops - > connect ( socket ,  saddr ,  slen ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Error %d connecting to server \n " ,  rc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-21 07:18:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										sock_release ( socket ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										server - > ssocket  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( sport  = =  htons ( RFC1001_PORT ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  ip_rfc1001_connect ( server ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								ip_connect ( struct  TCP_Server_Info  * server )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-03-13 18:55:55 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									__be16  * sport ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  sockaddr_in6  * addr6  =  ( struct  sockaddr_in6  * ) & server - > dstaddr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  sockaddr_in  * addr  =  ( struct  sockaddr_in  * ) & server - > dstaddr ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( server - > dstaddr . ss_family  = =  AF_INET6 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sport  =  & addr6 - > sin6_port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sport  =  & addr - > sin_port ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( * sport  = =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* try with 445 port at first */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* sport  =  htons ( CIFS_PORT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-01 17:06:02 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  generic_ip_connect ( server ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  ( rc  > =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-01 01:28:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* if it failed, try with 139 port */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* sport  =  htons ( RFC1001_PORT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-01 01:28:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 19:08:35 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  generic_ip_connect ( server ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-20 11:21:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  reset_cifs_unix_caps ( unsigned  int  xid ,  struct  cifs_tcon  * tcon ,  
						 
					
						
							
								
									
										
										
										
											2011-06-17 09:05:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											  struct  cifs_sb_info  * cifs_sb ,  struct  smb_vol  * vol_info ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-14 04:42:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* if we are reconnecting then should we check to see if
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  any  requested  capabilities  changed  locally  e . g .  via 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  remount  but  we  can  not  do  much  about  it  here 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  if  they  have  ( even  if  we  could  detect  it  by  the  following ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Perhaps  we  could  add  a  backpointer  to  array  of  sb  from  tcon 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  or  if  we  change  to  make  all  sb  to  same  share  the  same 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  sb  as  NFS  -  then  we  only  have  one  backpointer  to  sb . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  What  if  we  wanted  to  mount  the  server  share  twice  once  with 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  and  once  without  posixacls  or  posix  paths ?  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									__u64  saved_cap  =  le64_to_cpu ( tcon - > fsUnixInfo . Capability ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-07-18 23:21:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( vol_info  & &  vol_info - > no_linux_ext )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tcon - > fsUnixInfo . Capability  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tcon - > unix_ext  =  0 ;  /* Unix Extensions disabled */ 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Linux protocol extensions disabled \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-18 23:21:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( vol_info ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tcon - > unix_ext  =  1 ;  /* Unix Extensions supported */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( tcon - > unix_ext  = =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Unix extensions disabled so not set on reconnect \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-18 23:21:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-07-10 01:16:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! CIFSSMBQFSUnixInfo ( xid ,  tcon ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-14 04:42:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										__u64  cap  =  le64_to_cpu ( tcon - > fsUnixInfo . Capability ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " unix caps which server supports %lld \n " ,  cap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-14 04:42:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* check for reconnect case in which we do not
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   want  to  change  the  mount  behavior  if  we  can  avoid  it  */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-10 01:16:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( vol_info  = =  NULL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/* turn off POSIX ACL and PATHNAMES if not set
 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-14 04:42:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											   originally  at  mount  time  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ( saved_cap  &  CIFS_UNIX_POSIX_ACL_CAP )  = =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												cap  & =  ~ CIFS_UNIX_POSIX_ACL_CAP ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-15 19:06:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ( saved_cap  &  CIFS_UNIX_POSIX_PATHNAMES_CAP )  = =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( cap  &  CIFS_UNIX_POSIX_PATHNAMES_CAP ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													cifs_dbg ( VFS ,  " POSIXPATH support change \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-14 04:42:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cap  & =  ~ CIFS_UNIX_POSIX_PATHNAMES_CAP ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-15 19:06:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  if  ( ( cap  &  CIFS_UNIX_POSIX_PATHNAMES_CAP )  = =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( VFS ,  " possible reconnect error \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												cifs_dbg ( VFS ,  " server disabled POSIX path support \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-02-15 19:06:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-14 04:42:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-26 18:38:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( cap  &  CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( VFS ,  " per-share encryption not supported yet \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-26 18:38:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-02-14 04:42:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cap  & =  CIFS_UNIX_CAP_MASK ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-06-24 18:30:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( vol_info  & &  vol_info - > no_psx_acl ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-14 04:42:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cap  & =  ~ CIFS_UNIX_POSIX_ACL_CAP ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-06-24 18:30:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( CIFS_UNIX_POSIX_ACL_CAP  &  cap )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " negotiated posix acl support \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-17 09:05:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( cifs_sb ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												cifs_sb - > mnt_cifs_flags  | = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													CIFS_MOUNT_POSIXACL ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-14 04:42:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-06-24 18:30:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( vol_info  & &  vol_info - > posix_paths  = =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-14 04:42:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cap  & =  ~ CIFS_UNIX_POSIX_PATHNAMES_CAP ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-06-24 18:30:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( cap  &  CIFS_UNIX_POSIX_PATHNAMES_CAP )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " negotiate posix pathnames \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-17 09:05:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( cifs_sb ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												cifs_sb - > mnt_cifs_flags  | = 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-14 04:42:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													CIFS_MOUNT_POSIX_PATHS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Negotiate caps 0x%x \n " ,  ( int ) cap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-14 04:42:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_CIFS_DEBUG2 
  
						 
					
						
							
								
									
										
										
										
											2007-06-24 18:30:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( cap  &  CIFS_UNIX_FCNTL_CAP ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " FCNTL cap \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-06-24 18:30:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( cap  &  CIFS_UNIX_EXTATTR_CAP ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " EXTATTR cap \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-06-24 18:30:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( cap  &  CIFS_UNIX_POSIX_PATHNAMES_CAP ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " POSIX path cap \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-06-24 18:30:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( cap  &  CIFS_UNIX_XATTR_CAP ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " XATTR cap \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-06-24 18:30:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( cap  &  CIFS_UNIX_POSIX_ACL_CAP ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " POSIX ACL cap \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-06-24 18:30:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( cap  &  CIFS_UNIX_LARGE_READ_CAP ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " very large read cap \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-06-24 18:30:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( cap  &  CIFS_UNIX_LARGE_WRITE_CAP ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " very large write cap \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-26 18:38:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( cap  &  CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " transport encryption cap \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-26 18:38:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( cap  &  CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( FYI ,  " mandatory transport encryption cap \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-02-14 04:42:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif  /* CIFS_DEBUG2 */ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( CIFSSMBSetFSUnixInfo ( xid ,  tcon ,  cap ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-24 20:25:46 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( vol_info  = =  NULL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( FYI ,  " resetting capabilities failed \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-24 20:25:46 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( VFS ,  " Negotiating Unix capabilities with the server failed. Consider mounting with the Unix Extensions disabled if problems are found by specifying the nounix mount option. \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-20 15:16:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-02-14 04:42:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  cifs_setup_cifs_sb ( struct  smb_vol  * pvolume_info ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											struct  cifs_sb_info  * cifs_sb ) 
							 
						 
					
						
							
								
									
										
										
										
											2008-10-22 13:57:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									INIT_DELAYED_WORK ( & cifs_sb - > prune_tlinks ,  cifs_prune_tlinks ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-06-17 09:20:04 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock_init ( & cifs_sb - > tlink_tree_lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cifs_sb - > tlink_tree  =  RB_ROOT ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-26 23:35:47 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:30:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  Temporarily  set  r / wsize  for  matching  superblock .  If  we  end  up  using 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  new  sb  then  client  will  later  negotiate  it  downward  if  needed . 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-26 23:35:47 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:30:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_sb - > rsize  =  pvolume_info - > rsize ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-26 23:35:47 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_sb - > wsize  =  pvolume_info - > wsize ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-13 19:45:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_sb - > mnt_uid  =  pvolume_info - > linux_uid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cifs_sb - > mnt_gid  =  pvolume_info - > linux_gid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cifs_sb - > mnt_file_mode  =  pvolume_info - > file_mode ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cifs_sb - > mnt_dir_mode  =  pvolume_info - > dir_mode ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " file mode: 0x%hx  dir mode: 0x%hx \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 cifs_sb - > mnt_file_mode ,  cifs_sb - > mnt_dir_mode ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-13 19:45:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-01 14:42:28 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_sb - > actimeo  =  pvolume_info - > actimeo ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_sb - > local_nls  =  pvolume_info - > local_nls ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-01 14:42:28 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-13 19:45:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( pvolume_info - > noperm ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_NO_PERM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( pvolume_info - > setuids ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_SET_UID ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( pvolume_info - > server_ino ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_SERVER_INUM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( pvolume_info - > remap ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_MAP_SPECIAL_CHR ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( pvolume_info - > no_xattr ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_NO_XATTR ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( pvolume_info - > sfu_emul ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_UNX_EMUL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( pvolume_info - > nobrl ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_NO_BRL ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 15:21:59 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( pvolume_info - > nostrictsync ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-24 14:44:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_NOSSYNC ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-02 17:24:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( pvolume_info - > mand_lock ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_NOPOSIXBRL ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-26 06:02:00 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( pvolume_info - > rwpidforward ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_RWPIDFORWARD ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-13 19:45:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( pvolume_info - > cifs_acl ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_CIFS_ACL ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-04-24 15:28:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( pvolume_info - > backupuid_specified )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-26 09:56:44 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_CIFS_BACKUPUID ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-04-24 15:28:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_sb - > mnt_backupuid  =  pvolume_info - > backupuid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( pvolume_info - > backupgid_specified )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-26 09:56:44 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_CIFS_BACKUPGID ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-04-24 15:28:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_sb - > mnt_backupgid  =  pvolume_info - > backupgid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-13 19:45:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( pvolume_info - > override_uid ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_OVERR_UID ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( pvolume_info - > override_gid ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_OVERR_GID ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( pvolume_info - > dynperm ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_DYNPERM ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-05 18:13:36 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( pvolume_info - > fsc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_FSCACHE ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( pvolume_info - > multiuser ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  ( CIFS_MOUNT_MULTIUSER  | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													    CIFS_MOUNT_NO_PERM ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-24 14:16:35 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( pvolume_info - > strict_io ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_STRICT_IO ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-13 19:45:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( pvolume_info - > direct_io )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " mounting share using direct i/o \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-13 19:45:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_DIRECT_IO ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-30 14:56:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( pvolume_info - > mfsymlinks )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( pvolume_info - > sfu_emul )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( VFS ,  " mount option mfsymlinks ignored if sfu mount option is used \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-30 14:56:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											cifs_sb - > mnt_cifs_flags  | =  CIFS_MOUNT_MF_SYMLINKS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-13 19:45:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ( pvolume_info - > cifs_acl )  & &  ( pvolume_info - > dynperm ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( VFS ,  " mount option dynperm ignored if cifsacl mount option supported \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-10-22 13:57:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:10:39 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cleanup_volume_info_contents ( struct  smb_vol  * volume_info )  
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kfree ( volume_info - > username ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kzfree ( volume_info - > password ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-27 18:58:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kfree ( volume_info - > UNC ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kfree ( volume_info - > domainname ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									kfree ( volume_info - > iocharset ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kfree ( volume_info - > prepath ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:10:39 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_cleanup_volume_info ( struct  smb_vol  * volume_info )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! volume_info ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cleanup_volume_info_contents ( volume_info ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kfree ( volume_info ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:10:39 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-04-09 00:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_CIFS_DFS_UPCALL 
  
						 
					
						
							
								
									
										
										
										
											2012-11-28 22:34:41 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  cifs_build_path_to_root  returns  full  path  to  root  when  we  do  not  have  an 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  exiting  connection  ( tcon ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  char  *  
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:10:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								build_unc_path_to_root ( const  struct  smb_vol  * vol ,  
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  struct  cifs_sb_info  * cifs_sb ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:10:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									char  * full_path ,  * pos ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-10 06:10:45 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  pplen  =  vol - > prepath  ?  strlen ( vol - > prepath )  +  1  :  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:10:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  unc_len  =  strnlen ( vol - > UNC ,  MAX_TREE_SIZE  +  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:10:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									full_path  =  kmalloc ( unc_len  +  pplen  +  1 ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( full_path  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ERR_PTR ( - ENOMEM ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:10:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									strncpy ( full_path ,  vol - > UNC ,  unc_len ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pos  =  full_path  +  unc_len ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( pplen )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-31 10:00:18 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										* pos  =  CIFS_DIR_SEP ( cifs_sb ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										strncpy ( pos  +  1 ,  vol - > prepath ,  pplen ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:10:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										pos  + =  pplen ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									* pos  =  ' \0 ' ;  /* add trailing null */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 03:50:55 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									convert_delimiter ( full_path ,  CIFS_DIR_SEP ( cifs_sb ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " %s: full_path=%s \n " ,  __func__ ,  full_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  full_path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Perform  a  dfs  referral  query  for  a  share  and  ( optionally )  prefix 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  If  a  referral  is  found ,  cifs_sb - > mountdata  will  be  ( re - ) allocated 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  to  a  string  containing  updated  options  for  the  submount .   Otherwise  it 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  will  be  left  untouched . 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Returns  the  rc  from  get_dfs_path  to  the  caller ,  which  can  be  used  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  determine  whether  there  were  referrals . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:21:53 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								expand_dfs_referral ( const  unsigned  int  xid ,  struct  cifs_ses  * ses ,  
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										    struct  smb_vol  * volume_info ,  struct  cifs_sb_info  * cifs_sb , 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										    int  check_prefix ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  int  num_referrals  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  dfs_info3_param  * referrals  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									char  * full_path  =  NULL ,  * ref_path  =  NULL ,  * mdata  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									full_path  =  build_unc_path_to_root ( volume_info ,  cifs_sb ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( IS_ERR ( full_path ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  PTR_ERR ( full_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* For DFS paths, skip the first '\' of the UNC */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ref_path  =  check_prefix  ?  full_path  +  1  :  volume_info - > UNC  +  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:21:53 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  get_dfs_path ( xid ,  ses ,  ref_path ,  cifs_sb - > local_nls , 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											  & num_referrals ,  & referrals , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											  cifs_sb - > mnt_cifs_flags  &  CIFS_MOUNT_MAP_SPECIAL_CHR ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! rc  & &  num_referrals  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										char  * fake_devname  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mdata  =  cifs_compose_mount_options ( cifs_sb - > mountdata , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														   full_path  +  1 ,  referrals , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														   & fake_devname ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										free_dfs_info_array ( referrals ,  num_referrals ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( IS_ERR ( mdata ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											rc  =  PTR_ERR ( mdata ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											mdata  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:10:39 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											cleanup_volume_info_contents ( volume_info ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											rc  =  cifs_setup_volume_info ( volume_info ,  mdata , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															fake_devname ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:10:39 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										kfree ( fake_devname ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										kfree ( cifs_sb - > mountdata ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_sb - > mountdata  =  mdata ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									kfree ( full_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2009-04-09 00:36:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:10:38 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_setup_volume_info ( struct  smb_vol  * volume_info ,  char  * mount_data ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  char  * devname ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:10:38 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cifs_parse_mount_options ( mount_data ,  devname ,  volume_info ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - EINVAL ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:49 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( volume_info - > nullauth )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Anonymous login \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										kfree ( volume_info - > username ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										volume_info - > username  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:49 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( volume_info - > username )  { 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										/* BB fixme parse for domain name here */ 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Username: %s \n " ,  volume_info - > username ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( VFS ,  " No username specified \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* In userspace mount helper we can get user name from alternate
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   locations  such  as  env  variables  and  files  on  disk  */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:10:38 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  - EINVAL ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* this is needed for ASCII cp to Unicode converts */ 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:49 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( volume_info - > iocharset  = =  NULL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* load_nls_default cannot return null */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										volume_info - > local_nls  =  load_nls_default ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										volume_info - > local_nls  =  load_nls ( volume_info - > iocharset ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( volume_info - > local_nls  = =  NULL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_dbg ( VFS ,  " CIFS mount error: iocharset %s not found \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-21 03:50:45 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												 volume_info - > iocharset ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:10:38 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  - ELIBACC ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:10:38 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  smb_vol  *  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_get_volume_info ( char  * mount_data ,  const  char  * devname )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  smb_vol  * volume_info ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-11-26 11:09:57 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									volume_info  =  kmalloc ( sizeof ( struct  smb_vol ) ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:10:38 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! volume_info ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ERR_PTR ( - ENOMEM ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  cifs_setup_volume_info ( volume_info ,  mount_data ,  devname ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_cleanup_volume_info ( volume_info ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										volume_info  =  ERR_PTR ( rc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  volume_info ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  
						 
					
						
							
								
									
										
										
										
											2011-06-17 09:05:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								cifs_mount ( struct  cifs_sb_info  * cifs_sb ,  struct  smb_vol  * volume_info )  
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2012-03-21 06:30:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-20 11:21:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  xid ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:48:35 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  cifs_ses  * ses ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  cifs_tcon  * tcon ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:48:35 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  TCP_Server_Info  * server ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									char    * full_path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  tcon_link  * tlink ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef CONFIG_CIFS_DFS_UPCALL 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  referral_walks_count  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-09 12:21:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2011-06-17 08:24:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  bdi_setup_and_register ( & cifs_sb - > bdi ,  " cifs " ,  BDI_CAP_MAP_COPY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-09 12:21:07 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_CIFS_DFS_UPCALL 
  
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								try_mount_again :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* cleanup activities if we're chasing a referral */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( referral_walks_count )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( tcon ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											cifs_put_tcon ( tcon ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:48:35 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( ses ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											cifs_put_smb_ses ( ses ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-20 11:21:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										free_xid ( xid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2012-03-21 06:30:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tcon  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:48:35 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ses  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									server  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-05 09:55:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									full_path  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tlink  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-20 11:21:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									xid  =  get_xid ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* get a reference to a tcp session */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:48:35 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									server  =  cifs_get_tcp_session ( volume_info ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( IS_ERR ( server ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  PTR_ERR ( server ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-17 08:24:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bdi_destroy ( & cifs_sb - > bdi ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-01 18:41:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  out ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* get a reference to a SMB session */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:48:35 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ses  =  cifs_get_smb_ses ( server ,  volume_info ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( IS_ERR ( ses ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  PTR_ERR ( ses ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ses  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  mount_fail_check ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* search for existing tcon to this server share */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:48:35 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tcon  =  cifs_get_tcon ( ses ,  volume_info ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( IS_ERR ( tcon ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  PTR_ERR ( tcon ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tcon  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  remote_path_check ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-11-15 00:07:26 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* tell server which Unix caps we support */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-07-13 13:58:14 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cap_unix ( tcon - > ses ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-15 00:07:26 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* reset of caps checks mount to see if unix extensions
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   disabled  for  just  this  mount  */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-17 09:05:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										reset_cifs_unix_caps ( xid ,  tcon ,  cifs_sb ,  volume_info ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-26 18:38:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ( tcon - > ses - > server - > tcpStatus  = =  CifsNeedReconnect )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										    ( le64_to_cpu ( tcon - > fsUnixInfo . Capability )  & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										     CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											rc  =  - EACCES ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  mount_fail_check ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-15 00:07:26 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tcon - > unix_ext  =  0 ;  /* server does not support them */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-18 23:21:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:48:35 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* do not care if a following call succeed - informational */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! tcon - > ipc  & &  server - > ops - > qfs_tcon ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										server - > ops - > qfs_tcon ( xid ,  tcon ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-26 18:38:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-09-18 16:20:28 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_sb - > wsize  =  server - > ops - > negotiate_wsize ( tcon ,  volume_info ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cifs_sb - > rsize  =  server - > ops - > negotiate_rsize ( tcon ,  volume_info ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-19 16:22:58 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-19 15:30:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* tune readahead according to rsize */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-01 17:41:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_sb - > bdi . ra_pages  =  cifs_sb - > rsize  /  PAGE_CACHE_SIZE ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-19 16:22:58 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								remote_path_check :  
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_CIFS_DFS_UPCALL 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Perform  an  unconditional  check  for  whether  there  are  DFS 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  referrals  for  this  path  without  prefix ,  to  provide  support 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  for  DFS  referrals  from  w2k8  servers  which  don ' t  seem  to  respond 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  with  PATH_NOT_COVERED  to  requests  that  include  the  prefix . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Chase  the  referral  if  found ,  otherwise  continue  normally . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( referral_walks_count  = =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:48:35 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  refrc  =  expand_dfs_referral ( xid ,  ses ,  volume_info ,  cifs_sb , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! refrc )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											referral_walks_count + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  try_mount_again ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 03:50:55 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* check if a whole path is not remote */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-03-14 13:48:08 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! rc  & &  tcon )  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 14:40:22 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! server - > ops - > is_path_accessible )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											rc  =  - ENOSYS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  mount_fail_check ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2012-11-28 22:34:41 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  cifs_build_path_to_root  works  only  when  we  have  a  valid  tcon 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										full_path  =  cifs_build_path_to_root ( volume_info ,  cifs_sb ,  tcon ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-10 14:10:26 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( full_path  = =  NULL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											rc  =  - ENOMEM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  mount_fail_check ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 14:40:22 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  server - > ops - > is_path_accessible ( xid ,  tcon ,  cifs_sb , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														     full_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-06 21:07:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( rc  ! =  0  & &  rc  ! =  - EREMOTE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-10 14:10:26 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											kfree ( full_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  mount_fail_check ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										kfree ( full_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* get referral if needed */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc  = =  - EREMOTE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-03 03:12:08 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_CIFS_DFS_UPCALL 
  
						 
					
						
							
								
									
										
										
										
											2009-04-21 19:31:05 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( referral_walks_count  >  MAX_NESTED_LINKS )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *  BB :  when  we  implement  proper  loop  detection , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *      we  will  remove  this  check .  But  now  we  need  it 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *      to  prevent  an  indefinite  loop  if  ' DFS  tree '  is 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 *      misconfigured  ( i . e .  has  loops ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											rc  =  - ELOOP ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  mount_fail_check ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:48:35 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  expand_dfs_referral ( xid ,  ses ,  volume_info ,  cifs_sb ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-23 15:22:30 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! rc )  { 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-21 19:31:05 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											referral_walks_count + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											goto  try_mount_again ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 13:19:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										goto  mount_fail_check ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-03 03:12:08 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# else  /* No DFS support, return error on mount */ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  - EOPNOTSUPP ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  mount_fail_check ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* now, hang the tcon off of the superblock */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tlink  =  kzalloc ( sizeof  * tlink ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( tlink  = =  NULL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  - ENOMEM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  mount_fail_check ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:48:35 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tlink - > tl_uid  =  ses - > linux_uid ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tlink - > tl_tcon  =  tcon ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tlink - > tl_time  =  jiffies ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_bit ( TCON_LINK_MASTER ,  & tlink - > tl_flags ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_bit ( TCON_LINK_IN_TREE ,  & tlink - > tl_flags ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-28 11:16:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_sb - > master_tlink  =  tlink ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock ( & cifs_sb - > tlink_tree_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-28 11:16:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tlink_rb_insert ( & cifs_sb - > tlink_tree ,  tlink ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock ( & cifs_sb - > tlink_tree_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-28 13:33:38 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									queue_delayed_work ( cifsiod_wq ,  & cifs_sb - > prune_tlinks , 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												TLINK_IDLE_EXPIRE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								mount_fail_check :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* on error free sesinfo and tcon struct if needed */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* If find_unc succeeded then rc == 0 so we can not end */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-03-30 22:57:33 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* up accidentally freeing someone elses tcon struct */ 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( tcon ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											cifs_put_tcon ( tcon ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:48:35 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( ses ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											cifs_put_smb_ses ( ses ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-27 20:48:35 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cifs_put_tcp_session ( server ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-17 08:24:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bdi_destroy ( & cifs_sb - > bdi ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-01 17:54:42 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-11-16 22:21:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								out :  
						 
					
						
							
								
									
										
										
										
											2012-06-20 11:21:16 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									free_xid ( xid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-06-11 21:17:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Issue  a  TREE_CONNECT  request .  Note  that  for  IPC $  shares ,  that  the  tcon 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  pointer  may  be  NULL . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								int  
						 
					
						
							
								
									
										
										
										
											2012-05-25 11:11:39 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								CIFSTCon ( const  unsigned  int  xid ,  struct  cifs_ses  * ses ,  
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 const  char  * tree ,  struct  cifs_tcon  * tcon , 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									 const  struct  nls_table  * nls_codepage ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  smb_hdr  * smb_buffer ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  smb_hdr  * smb_buffer_response ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									TCONX_REQ  * pSMB ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									TCONX_RSP  * pSMBr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  char  * bcc_ptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-20 13:36:51 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  length ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									__u16  bytes_left ,  count ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ses  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - EIO ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									smb_buffer  =  cifs_buf_get ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-01 17:20:50 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( smb_buffer  = =  NULL ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return  - ENOMEM ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-01 17:20:50 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									smb_buffer_response  =  smb_buffer ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									header_assemble ( smb_buffer ,  SMB_COM_TREE_CONNECT_ANDX , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											NULL  /*no tid */  ,  4  /*wct */  ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-08-17 12:38:22 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-23 14:01:59 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									smb_buffer - > Mid  =  get_next_mid ( ses - > server ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									smb_buffer - > Uid  =  ses - > Suid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pSMB  =  ( TCONX_REQ  * )  smb_buffer ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pSMBr  =  ( TCONX_RSP  * )  smb_buffer_response ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pSMB - > AndXCommand  =  0xFF ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pSMB - > Flags  =  cpu_to_le16 ( TCON_EXTENDED_SECINFO ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bcc_ptr  =  & pSMB - > Password [ 0 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-11 21:17:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! tcon  | |  ( ses - > server - > sec_mode  &  SECMODE_USER ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-13 21:34:58 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										pSMB - > PasswordLength  =  cpu_to_le16 ( 1 ) ; 	/* minimum */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-01 19:20:10 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										* bcc_ptr  =  0 ;  /* password is null byte */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-13 21:34:58 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bcc_ptr + + ;               /* skip password */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-01 19:20:10 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* already aligned so no need to do it below */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-13 21:34:58 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-18 22:33:54 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										pSMB - > PasswordLength  =  cpu_to_le16 ( CIFS_AUTH_RESP_SIZE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-13 21:34:58 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* BB FIXME add code to fail this if NTLMv2 or Kerberos
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   specified  as  required  ( when  that  support  is  added  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   the  vfs  in  the  future )  as  only  NTLM  or  the  much 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-01 19:20:10 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										   weaker  LANMAN  ( which  we  do  not  send  by  default )  is  accepted 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-13 21:34:58 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										   by  Samba  ( not  sure  whether  other  servers  allow 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   NTLMv2  password  here )  */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-01 19:20:10 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef CONFIG_CIFS_WEAK_PW_HASH 
  
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ( global_secflags  &  CIFSSEC_MAY_LANMAN )  & & 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-12 19:52:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										    ( ses - > sectype  = =  LANMAN ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-27 15:20:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											calc_lanman_hash ( tcon - > password ,  ses - > server - > cryptkey , 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													 ses - > server - > sec_mode  & 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-05 20:41:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													    SECMODE_PW_ENCRYPT  ?  true  :  false , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													 bcc_ptr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-01 19:20:10 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif  /* CIFS_WEAK_PW_HASH */ 
  
						 
					
						
							
								
									
										
										
										
											2011-01-27 09:58:04 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										rc  =  SMBNTencrypt ( tcon - > password ,  ses - > server - > cryptkey , 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-20 13:21:59 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													bcc_ptr ,  nls_codepage ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-13 21:34:58 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-18 22:33:54 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bcc_ptr  + =  CIFS_AUTH_RESP_SIZE ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-10 01:16:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ses - > capabilities  &  CAP_UNICODE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-01 19:20:10 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											/* must align unicode strings */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											* bcc_ptr  =  0 ;  /* null byte password */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											bcc_ptr + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2006-01-13 21:34:58 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-26 07:01:00 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ses - > server - > sign ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										smb_buffer - > Flags2  | =  SMBFLG2_SECURITY_SIGNATURE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ses - > capabilities  &  CAP_STATUS32 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										smb_buffer - > Flags2  | =  SMBFLG2_ERR_STATUS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ses - > capabilities  &  CAP_DFS )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										smb_buffer - > Flags2  | =  SMBFLG2_DFS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ses - > capabilities  &  CAP_UNICODE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										smb_buffer - > Flags2  | =  SMBFLG2_UNICODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										length  = 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-18 22:32:33 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										    cifs_strtoUTF16 ( ( __le16  * )  bcc_ptr ,  tree , 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											6  /* max utf8 char length in bytes */  * 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-30 18:04:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											( /* server len*/  +  256  /* share len */ ) ,  nls_codepage ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bcc_ptr  + =  2  *  length ; 	/* convert num 16 bit words to bytes */ 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										bcc_ptr  + =  2 ; 	/* skip trailing null */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 		/* ASCII */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										strcpy ( bcc_ptr ,  tree ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bcc_ptr  + =  strlen ( tree )  +  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									strcpy ( bcc_ptr ,  " ????? " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bcc_ptr  + =  strlen ( " ????? " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bcc_ptr  + =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									count  =  bcc_ptr  -  & pSMB - > Password [ 0 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-29 05:40:20 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									pSMB - > hdr . smb_buf_length  =  cpu_to_be32 ( be32_to_cpu ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													pSMB - > hdr . smb_buf_length )  +  count ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									pSMB - > ByteCount  =  cpu_to_le16 ( count ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-11-13 22:41:37 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  SendReceive ( xid ,  ses ,  smb_buffer ,  smb_buffer_response ,  & length , 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-11 07:24:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* above now done in SendReceive */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ( rc  = =  0 )  & &  ( tcon  ! =  NULL ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-01 05:27:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bool  is_unicode ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										tcon - > tidStatus  =  CifsGood ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-11-13 19:45:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tcon - > need_reconnect  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										tcon - > tid  =  smb_buffer_response - > Tid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bcc_ptr  =  pByteArea ( smb_buffer_response ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-20 13:36:51 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bytes_left  =  get_bcc ( smb_buffer_response ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-30 07:16:21 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										length  =  strnlen ( bcc_ptr ,  bytes_left  -  2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-01 05:27:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( smb_buffer - > Flags2  &  SMBFLG2_UNICODE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											is_unicode  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											is_unicode  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-04-30 07:16:21 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* skip service field (NB: this field is always ASCII) */ 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-28 22:28:55 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( length  = =  3 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ( bcc_ptr [ 0 ]  = =  ' I ' )  & &  ( bcc_ptr [ 1 ]  = =  ' P ' )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											    ( bcc_ptr [ 2 ]  = =  ' C ' ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( FYI ,  " IPC connection \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-28 22:28:55 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tcon - > ipc  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( length  = =  2 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ( bcc_ptr [ 0 ]  = =  ' A ' )  & &  ( bcc_ptr [ 1 ]  = =  ' : ' ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												/* the most common case */ 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												cifs_dbg ( FYI ,  " disk share connection \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-09-28 22:28:55 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bcc_ptr  + =  length  +  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-30 07:16:21 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bytes_left  - =  ( length  +  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-24 01:57:47 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										strlcpy ( tcon - > treeName ,  tree ,  sizeof ( tcon - > treeName ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-30 07:16:21 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* mostly informational -- no need to fail on error here */ 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-20 13:40:52 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										kfree ( tcon - > nativeFileSystem ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-18 22:32:33 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tcon - > nativeFileSystem  =  cifs_strndup_from_utf16 ( bcc_ptr , 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-01 05:27:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														      bytes_left ,  is_unicode , 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-30 07:16:21 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														      nls_codepage ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " nativeFileSystem=%s \n " ,  tcon - > nativeFileSystem ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-30 07:16:21 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-07-10 01:16:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ( smb_buffer_response - > WordCount  = =  3 )  | | 
							 
						 
					
						
							
								
									
										
										
										
											2006-10-12 21:33:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											 ( smb_buffer_response - > WordCount  = =  7 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											/* field is in same location */ 
							 
						 
					
						
							
								
									
										
										
										
											2006-05-31 22:40:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											tcon - > Flags  =  le16_to_cpu ( pSMBr - > OptionalSupport ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											tcon - > Flags  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( FYI ,  " Tcon flags: 0x%x \n " ,  tcon - > Flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									}  else  if  ( ( rc  = =  0 )  & &  tcon  = =  NULL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* all we need to save for IPC$ connection */ 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										ses - > ipc_tid  =  smb_buffer_response - > Tid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2007-10-03 16:41:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_buf_release ( smb_buffer ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-03 12:53:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  delayed_free ( struct  rcu_head  * p )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  cifs_sb_info  * sbi  =  container_of ( p ,  struct  cifs_sb_info ,  rcu ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unload_nls ( sbi - > local_nls ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									kfree ( sbi ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-06-17 09:27:16 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_umount ( struct  cifs_sb_info  * cifs_sb )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2010-10-28 11:16:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  rb_root  * root  =  & cifs_sb - > tlink_tree ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  rb_node  * node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  tcon_link  * tlink ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cancel_delayed_work_sync ( & cifs_sb - > prune_tlinks ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-28 11:16:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock ( & cifs_sb - > tlink_tree_lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( ( node  =  rb_first ( root ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tlink  =  rb_entry ( node ,  struct  tcon_link ,  tl_rbnode ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_get_tlink ( tlink ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										clear_bit ( TCON_LINK_IN_TREE ,  & tlink - > tl_flags ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rb_erase ( node ,  root ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-28 11:16:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										spin_unlock ( & cifs_sb - > tlink_tree_lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_put_tlink ( tlink ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										spin_lock ( & cifs_sb - > tlink_tree_lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_unlock ( & cifs_sb - > tlink_tree_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-06-17 08:24:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bdi_destroy ( & cifs_sb - > bdi ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-17 09:42:43 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kfree ( cifs_sb - > mountdata ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-03 12:53:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									call_rcu ( & cifs_sb - > rcu ,  delayed_free ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-07-13 00:33:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 10:43:58 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_negotiate_protocol ( const  unsigned  int  xid ,  struct  cifs_ses  * ses )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  rc  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  TCP_Server_Info  * server  =  ses - > server ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 10:43:58 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! server - > ops - > need_neg  | |  ! server - > ops - > negotiate ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  - ENOSYS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* only send once per connect */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 10:43:58 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! server - > ops - > need_neg ( server ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-17 17:53:29 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_credits ( server ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 10:43:58 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rc  =  server - > ops - > negotiate ( xid ,  ses ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc  = =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										spin_lock ( & GlobalMid_Lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-10 16:14:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( server - > tcpStatus  = =  CifsNeedNegotiate ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											server - > tcpStatus  =  CifsGood ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											rc  =  - EHOSTDOWN ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										spin_unlock ( & GlobalMid_Lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 10:54:49 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_setup_session ( const  unsigned  int  xid ,  struct  cifs_ses  * ses ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   struct  nls_table  * nls_info ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2012-05-25 10:54:49 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc  =  - ENOSYS ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  TCP_Server_Info  * server  =  ses - > server ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-08-06 05:11:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-04-24 07:57:48 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ses - > capabilities  =  server - > capabilities ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-08-06 05:11:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( linuxExtEnabled  = =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-07-13 13:58:14 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ses - > capabilities  & =  ( ~ server - > vals - > cap_unix ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-30 16:13:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cifs_dbg ( FYI ,  " Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										 server - > sec_mode ,  server - > capabilities ,  server - > timeAdj ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-08-18 15:41:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-25 10:54:49 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( server - > ops - > sess_setup ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rc  =  server - > ops - > sess_setup ( xid ,  ses ,  nls_info ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-29 08:35:09 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( rc ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-04 22:12:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_dbg ( VFS ,  " Send error in SessSetup = %d \n " ,  rc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-21 06:42:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  rc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_set_vol_auth ( struct  smb_vol  * vol ,  struct  cifs_ses  * ses )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-06-12 19:52:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									vol - > sectype  =  ses - > sectype ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* krb5 is special, since we don't need username or pw */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( vol - > sectype  = =  Kerberos ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  cifs_set_cifscreds ( vol ,  ses ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  struct  cifs_tcon  *  
						 
					
						
							
								
									
										
										
										
											2013-02-06 01:48:56 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								cifs_construct_tcon ( struct  cifs_sb_info  * cifs_sb ,  kuid_t  fsuid )  
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  rc ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  cifs_tcon  * master_tcon  =  cifs_sb_master_tcon ( cifs_sb ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  cifs_ses  * ses ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  cifs_tcon  * tcon  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  smb_vol  * vol_info ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol_info  =  kzalloc ( sizeof ( * vol_info ) ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-24 11:39:22 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( vol_info  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ERR_PTR ( - ENOMEM ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol_info - > local_nls  =  cifs_sb - > local_nls ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol_info - > linux_uid  =  fsuid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol_info - > cred_uid  =  fsuid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol_info - > UNC  =  master_tcon - > treeName ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol_info - > retry  =  master_tcon - > retry ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol_info - > nocase  =  master_tcon - > nocase ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol_info - > local_lease  =  master_tcon - > local_lease ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol_info - > no_linux_ext  =  ! master_tcon - > unix_ext ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-26 07:01:00 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									vol_info - > sectype  =  master_tcon - > ses - > sectype ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vol_info - > sign  =  master_tcon - > ses - > sign ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rc  =  cifs_set_vol_auth ( vol_info ,  master_tcon - > ses ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tcon  =  ERR_PTR ( rc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* get a reference for the same TCP session */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_lock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									+ + master_tcon - > ses - > server - > srv_count ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-18 23:29:37 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									spin_unlock ( & cifs_tcp_ses_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ses  =  cifs_get_smb_ses ( master_tcon - > ses - > server ,  vol_info ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( IS_ERR ( ses ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tcon  =  ( struct  cifs_tcon  * ) ses ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_put_tcp_session ( master_tcon - > ses - > server ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tcon  =  cifs_get_tcon ( ses ,  vol_info ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( IS_ERR ( tcon ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_put_smb_ses ( ses ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										goto  out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-07-13 13:58:14 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cap_unix ( ses ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										reset_cifs_unix_caps ( 0 ,  tcon ,  NULL ,  vol_info ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								out :  
						 
					
						
							
								
									
										
										
										
											2012-01-17 16:09:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kfree ( vol_info - > username ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									kfree ( vol_info - > password ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kfree ( vol_info ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  tcon ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-27 04:34:02 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  cifs_tcon  *  
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								cifs_sb_master_tcon ( struct  cifs_sb_info  * cifs_sb )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  tlink_tcon ( cifs_sb_master_tlink ( cifs_sb ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-28 11:16:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/* find and return a tlink with given uid */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  struct  tcon_link  *  
						 
					
						
							
								
									
										
										
										
											2013-02-06 01:48:56 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								tlink_rb_search ( struct  rb_root  * root ,  kuid_t  uid )  
						 
					
						
							
								
									
										
										
										
											2010-10-28 11:16:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  rb_node  * node  =  root - > rb_node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  tcon_link  * tlink ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( node )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tlink  =  rb_entry ( node ,  struct  tcon_link ,  tl_rbnode ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-02-06 01:48:56 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( uid_gt ( tlink - > tl_uid ,  uid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-28 11:16:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											node  =  node - > rb_left ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-06 01:48:56 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( uid_lt ( tlink - > tl_uid ,  uid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-28 11:16:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											node  =  node - > rb_right ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  tlink ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* insert a tcon_link into the tree */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								tlink_rb_insert ( struct  rb_root  * root ,  struct  tcon_link  * new_tlink )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  rb_node  * * new  =  & ( root - > rb_node ) ,  * parent  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  tcon_link  * tlink ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( * new )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tlink  =  rb_entry ( * new ,  struct  tcon_link ,  tl_rbnode ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										parent  =  * new ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-02-06 01:48:56 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( uid_gt ( tlink - > tl_uid ,  new_tlink - > tl_uid ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-28 11:16:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											new  =  & ( ( * new ) - > rb_left ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											new  =  & ( ( * new ) - > rb_right ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rb_link_node ( & new_tlink - > tl_rbnode ,  parent ,  new ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									rb_insert_color ( & new_tlink - > tl_rbnode ,  root ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Find  or  construct  an  appropriate  tcon  given  a  cifs_sb  and  the  fsuid  of  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  current  task . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  If  the  superblock  doesn ' t  refer  to  a  multiuser  mount ,  then  just  return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  the  master  tcon  for  the  mount . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-03 10:53:49 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  First ,  search  the  rbtree  for  an  existing  tcon  for  this  fsuid .  If  one 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  exists ,  then  check  to  see  if  it ' s  pending  construction .  If  it  is  then  wait 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  for  construction  to  complete .  Once  it ' s  no  longer  pending ,  check  to  see  if 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  it  failed  and  either  return  an  error  or  retry  construction ,  depending  on 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  the  timeout . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  If  one  doesn ' t  exist  then  insert  a  new  tcon_link  struct  into  the  tree  and 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  try  to  construct  a  new  one . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  tcon_link  *  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_sb_tlink ( struct  cifs_sb_info  * cifs_sb )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  ret ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-06 01:48:56 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									kuid_t  fsuid  =  current_fsuid ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  tcon_link  * tlink ,  * newtlink ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! ( cifs_sb - > mnt_cifs_flags  &  CIFS_MOUNT_MULTIUSER ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  cifs_get_tlink ( cifs_sb_master_tlink ( cifs_sb ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_lock ( & cifs_sb - > tlink_tree_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-28 11:16:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tlink  =  tlink_rb_search ( & cifs_sb - > tlink_tree ,  fsuid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( tlink ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_get_tlink ( tlink ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_unlock ( & cifs_sb - > tlink_tree_lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( tlink  = =  NULL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										newtlink  =  kzalloc ( sizeof ( * tlink ) ,  GFP_KERNEL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( newtlink  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  ERR_PTR ( - ENOMEM ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-28 11:16:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										newtlink - > tl_uid  =  fsuid ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										newtlink - > tl_tcon  =  ERR_PTR ( - EACCES ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_bit ( TCON_LINK_PENDING ,  & newtlink - > tl_flags ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_bit ( TCON_LINK_IN_TREE ,  & newtlink - > tl_flags ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_get_tlink ( newtlink ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										spin_lock ( & cifs_sb - > tlink_tree_lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* was one inserted after previous search? */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-28 11:16:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tlink  =  tlink_rb_search ( & cifs_sb - > tlink_tree ,  fsuid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( tlink )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											cifs_get_tlink ( tlink ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											spin_unlock ( & cifs_sb - > tlink_tree_lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											kfree ( newtlink ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  wait_for_construction ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tlink  =  newtlink ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-28 11:16:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tlink_rb_insert ( & cifs_sb - > tlink_tree ,  tlink ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										spin_unlock ( & cifs_sb - > tlink_tree_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								wait_for_construction :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ret  =  wait_on_bit ( & tlink - > tl_flags ,  TCON_LINK_PENDING , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												  TASK_INTERRUPTIBLE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ret )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											cifs_put_tlink ( tlink ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												sched: Remove proliferation of wait_on_bit() action functions
The current "wait_on_bit" interface requires an 'action'
function to be provided which does the actual waiting.
There are over 20 such functions, many of them identical.
Most cases can be satisfied by one of just two functions, one
which uses io_schedule() and one which just uses schedule().
So:
 Rename wait_on_bit and        wait_on_bit_lock to
        wait_on_bit_action and wait_on_bit_lock_action
 to make it explicit that they need an action function.
 Introduce new wait_on_bit{,_lock} and wait_on_bit{,_lock}_io
 which are *not* given an action function but implicitly use
 a standard one.
 The decision to error-out if a signal is pending is now made
 based on the 'mode' argument rather than being encoded in the action
 function.
 All instances of the old wait_on_bit and wait_on_bit_lock which
 can use the new version have been changed accordingly and their
 action functions have been discarded.
 wait_on_bit{_lock} does not return any specific error code in the
 event of a signal so the caller must check for non-zero and
 interpolate their own error code as appropriate.
The wait_on_bit() call in __fscache_wait_on_invalidate() was
ambiguous as it specified TASK_UNINTERRUPTIBLE but used
fscache_wait_bit_interruptible as an action function.
David Howells confirms this should be uniformly
"uninterruptible"
The main remaining user of wait_on_bit{,_lock}_action is NFS
which needs to use a freezer-aware schedule() call.
A comment in fs/gfs2/glock.c notes that having multiple 'action'
functions is useful as they display differently in the 'wchan'
field of 'ps'. (and /proc/$PID/wchan).
As the new bit_wait{,_io} functions are tagged "__sched", they
will not show up at all, but something higher in the stack.  So
the distinction will still be visible, only with different
function names (gds2_glock_wait versus gfs2_glock_dq_wait in the
gfs2/glock.c case).
Since first version of this patch (against 3.15) two new action
functions appeared, on in NFS and one in CIFS.  CIFS also now
uses an action function that makes the same freezer aware
schedule call as NFS.
Signed-off-by: NeilBrown <neilb@suse.de>
Acked-by: David Howells <dhowells@redhat.com> (fscache, keys)
Acked-by: Steven Whitehouse <swhiteho@redhat.com> (gfs2)
Acked-by: Peter Zijlstra <peterz@infradead.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Steve French <sfrench@samba.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: http://lkml.kernel.org/r/20140707051603.28027.72349.stgit@notabene.brown
Signed-off-by: Ingo Molnar <mingo@kernel.org>
											 
										 
										
											2014-07-07 15:16:04 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  ERR_PTR ( - ERESTARTSYS ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* if it's good, return it */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! IS_ERR ( tlink - > tl_tcon ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  tlink ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										/* return error if we tried this already recently */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( time_before ( jiffies ,  tlink - > tl_time  +  TLINK_ERROR_EXPIRE ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											cifs_put_tlink ( tlink ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  ERR_PTR ( - EACCES ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( test_and_set_bit ( TCON_LINK_PENDING ,  & tlink - > tl_flags ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											goto  wait_for_construction ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tlink - > tl_tcon  =  cifs_construct_tcon ( cifs_sb ,  fsuid ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									clear_bit ( TCON_LINK_PENDING ,  & tlink - > tl_flags ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									wake_up_bit ( & tlink - > tl_flags ,  TCON_LINK_PENDING ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( IS_ERR ( tlink - > tl_tcon ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_put_tlink ( tlink ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ERR_PTR ( - EACCES ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  tlink ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  periodic  workqueue  job  that  scans  tcon_tree  for  a  superblock  and  closes 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  out  tcons . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cifs_prune_tlinks ( struct  work_struct  * work )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  cifs_sb_info  * cifs_sb  =  container_of ( work ,  struct  cifs_sb_info , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														    prune_tlinks . work ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-28 11:16:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  rb_root  * root  =  & cifs_sb - > tlink_tree ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  rb_node  * node  =  rb_first ( root ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  rb_node  * tmp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  tcon_link  * tlink ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-28 11:16:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Because  we  drop  the  spinlock  in  the  loop  in  order  to  put  the  tlink 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  it ' s  not  guarded  against  removal  of  links  from  the  tree .  The  only 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  places  that  remove  entries  from  the  tree  are  this  function  and 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  umounts .  Because  this  function  is  non - reentrant  and  is  canceled 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  before  umount  can  proceed ,  this  is  safe . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_lock ( & cifs_sb - > tlink_tree_lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									node  =  rb_first ( root ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( node  ! =  NULL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tmp  =  node ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										node  =  rb_next ( tmp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tlink  =  rb_entry ( tmp ,  struct  tcon_link ,  tl_rbnode ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( test_bit ( TCON_LINK_MASTER ,  & tlink - > tl_flags )  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										    atomic_read ( & tlink - > tl_count )  ! =  0  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										    time_after ( tlink - > tl_time  +  TLINK_IDLE_EXPIRE ,  jiffies ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-28 11:16:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cifs_get_tlink ( tlink ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										clear_bit ( TCON_LINK_IN_TREE ,  & tlink - > tl_flags ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										rb_erase ( tmp ,  root ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										spin_unlock ( & cifs_sb - > tlink_tree_lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cifs_put_tlink ( tlink ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										spin_lock ( & cifs_sb - > tlink_tree_lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									spin_unlock ( & cifs_sb - > tlink_tree_lock ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-03-23 14:40:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									queue_delayed_work ( cifsiod_wq ,  & cifs_sb - > prune_tlinks , 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 19:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												TLINK_IDLE_EXPIRE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}