Browse Source

Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6

Linus Torvalds 19 years ago
parent
commit
5e04e7fe77
10 changed files with 96 additions and 21 deletions
  1. 43 10
      fs/Kconfig
  2. 1 1
      fs/cifs/CHANGES
  3. 3 2
      fs/cifs/cifs_unicode.c
  4. 8 3
      fs/cifs/cifsfs.c
  5. 1 1
      fs/cifs/cifsproto.h
  6. 0 2
      fs/cifs/cifssmb.c
  7. 37 0
      fs/cifs/cn_cifs.h
  8. 1 0
      fs/cifs/connect.c
  9. 0 2
      fs/cifs/inode.c
  10. 2 0
      include/linux/connector.h

+ 43 - 10
fs/Kconfig

@@ -1601,9 +1601,10 @@ config CIFS
 	  PC operating systems.  The CIFS protocol is fully supported by 
 	  PC operating systems.  The CIFS protocol is fully supported by 
 	  file servers such as Windows 2000 (including Windows 2003, NT 4  
 	  file servers such as Windows 2000 (including Windows 2003, NT 4  
 	  and Windows XP) as well by Samba (which provides excellent CIFS
 	  and Windows XP) as well by Samba (which provides excellent CIFS
-	  server support for Linux and many other operating systems). Currently
-	  you must use the smbfs client filesystem to access older SMB servers
-	  such as Windows 9x and OS/2.
+	  server support for Linux and many other operating systems). Limited
+	  support for Windows ME and similar servers is provided as well. 
+	  You must use the smbfs client filesystem to access older SMB servers
+	  such as OS/2 and DOS.
 
 
 	  The intent of the cifs module is to provide an advanced
 	  The intent of the cifs module is to provide an advanced
 	  network file system client for mounting to CIFS compliant servers, 
 	  network file system client for mounting to CIFS compliant servers, 
@@ -1614,7 +1615,7 @@ config CIFS
 	  cifs if running only a (Samba) server. It is possible to enable both
 	  cifs if running only a (Samba) server. It is possible to enable both
 	  smbfs and cifs (e.g. if you are using CIFS for accessing Windows 2003
 	  smbfs and cifs (e.g. if you are using CIFS for accessing Windows 2003
 	  and Samba 3 servers, and smbfs for accessing old servers). If you need 
 	  and Samba 3 servers, and smbfs for accessing old servers). If you need 
-	  to mount to Samba or Windows 2003 servers from this machine, say Y.
+	  to mount to Samba or Windows from this machine, say Y.
 
 
 config CIFS_STATS
 config CIFS_STATS
         bool "CIFS statistics"
         bool "CIFS statistics"
@@ -1623,8 +1624,22 @@ config CIFS_STATS
           Enabling this option will cause statistics for each server share
           Enabling this option will cause statistics for each server share
 	  mounted by the cifs client to be displayed in /proc/fs/cifs/Stats
 	  mounted by the cifs client to be displayed in /proc/fs/cifs/Stats
 
 
+config CIFS_STATS2
+	bool "CIFS extended statistics"
+	depends on CIFS_STATS
+	help
+	  Enabling this option will allow more detailed statistics on SMB
+	  request timing to be displayed in /proc/fs/cifs/DebugData and also
+	  allow optional logging of slow responses to dmesg (depending on the
+	  value of /proc/fs/cifs/cifsFYI, see fs/cifs/README for more details).
+	  These additional statistics may have a minor effect on performance
+	  and memory utilization.
+
+	  Unless you are a developer or are doing network performance analysis
+	  or tuning, say N.
+
 config CIFS_XATTR
 config CIFS_XATTR
-        bool "CIFS extended attributes (EXPERIMENTAL)"
+        bool "CIFS extended attributes"
         depends on CIFS
         depends on CIFS
         help
         help
           Extended attributes are name:value pairs associated with inodes by
           Extended attributes are name:value pairs associated with inodes by
@@ -1636,11 +1651,11 @@ config CIFS_XATTR
           prefaced by the user namespace prefix. The system namespace
           prefaced by the user namespace prefix. The system namespace
           (used by some filesystems to store ACLs) is not supported at
           (used by some filesystems to store ACLs) is not supported at
           this time.
           this time.
-                                                                                                    
+
           If unsure, say N.
           If unsure, say N.
 
 
 config CIFS_POSIX
 config CIFS_POSIX
-        bool "CIFS POSIX Extensions (EXPERIMENTAL)"
+        bool "CIFS POSIX Extensions"
         depends on CIFS_XATTR
         depends on CIFS_XATTR
         help
         help
           Enabling this option will cause the cifs client to attempt to
           Enabling this option will cause the cifs client to attempt to
@@ -1653,10 +1668,28 @@ config CIFS_POSIX
 
 
 config CIFS_EXPERIMENTAL
 config CIFS_EXPERIMENTAL
 	  bool "CIFS Experimental Features (EXPERIMENTAL)"
 	  bool "CIFS Experimental Features (EXPERIMENTAL)"
-	  depends on CIFS
+	  depends on CIFS && EXPERIMENTAL
+	  help
+	    Enables cifs features under testing. These features are
+	    experimental and currently include support for writepages
+	    (multipage writebehind performance improvements) and directory
+	    change notification ie fcntl(F_DNOTIFY) as well as some security
+	    improvements.  Some also depend on setting at runtime the
+	    pseudo-file /proc/fs/cifs/Experimental (which is disabled by
+	    default). See the file fs/cifs/README for more details.
+
+	    If unsure, say N.
+
+config CIFS_UPCALL
+	  bool "CIFS Kerberos/SPNEGO advanced session setup (EXPERIMENTAL)"
+	  depends on CIFS_EXPERIMENTAL
+	  select CONNECTOR
 	  help
 	  help
-	    Enables cifs features under testing. These features
-	    are highly experimental.  If unsure, say N.
+	    Enables an upcall mechanism for CIFS which will be used to contact
+	    userspace helper utilities to provide SPNEGO packaged Kerberos
+	    tickets which are needed to mount to certain secure servers
+	    (for which more secure Kerberos authentication is required). If
+	    unsure, say N.
 
 
 config NCP_FS
 config NCP_FS
 	tristate "NCP file system support (to mount NetWare volumes)"
 	tristate "NCP file system support (to mount NetWare volumes)"

+ 1 - 1
fs/cifs/CHANGES

@@ -2,7 +2,7 @@ Version 1.39
 ------------
 ------------
 Defer close of a file handle slightly if pending writes depend on that file handle
 Defer close of a file handle slightly if pending writes depend on that file handle
 (this reduces the EBADF bad file handle errors that can be logged under heavy
 (this reduces the EBADF bad file handle errors that can be logged under heavy
-stress on writes).
+stress on writes). Modify cifs Kconfig options to expose CONFIG_CIFS_STATS2 
 
 
 Version 1.38
 Version 1.38
 ------------
 ------------

+ 3 - 2
fs/cifs/cifs_unicode.c

@@ -74,10 +74,11 @@ cifs_strtoUCS(wchar_t * to, const char *from, int len,
 			cERROR(1,
 			cERROR(1,
 			       ("cifs_strtoUCS: char2uni returned %d",
 			       ("cifs_strtoUCS: char2uni returned %d",
 				charlen));
 				charlen));
-			to[i] = cpu_to_le16(0x003f);	/* a question mark */
+			/* A question mark */
+			to[i] = (wchar_t)cpu_to_le16(0x003f);
 			charlen = 1;
 			charlen = 1;
 		} else 
 		} else 
-			to[i] = cpu_to_le16(to[i]);
+			to[i] = (wchar_t)cpu_to_le16(to[i]);
 
 
 	}
 	}
 
 

+ 8 - 3
fs/cifs/cifsfs.c

@@ -405,6 +405,7 @@ static struct quotactl_ops cifs_quotactl_ops = {
 };
 };
 #endif
 #endif
 
 
+#ifdef CONFIG_CIFS_EXPERIMENTAL
 static void cifs_umount_begin(struct super_block * sblock)
 static void cifs_umount_begin(struct super_block * sblock)
 {
 {
 	struct cifs_sb_info *cifs_sb;
 	struct cifs_sb_info *cifs_sb;
@@ -422,16 +423,18 @@ static void cifs_umount_begin(struct super_block * sblock)
 		tcon->tidStatus = CifsExiting;
 		tcon->tidStatus = CifsExiting;
 	up(&tcon->tconSem);
 	up(&tcon->tconSem);
 
 
+	/* cancel_brl_requests(tcon); */
+	/* cancel_notify_requests(tcon); */
 	if(tcon->ses && tcon->ses->server)
 	if(tcon->ses && tcon->ses->server)
 	{
 	{
-		cERROR(1,("wake up tasks now - umount begin not complete"));
+		cFYI(1,("wake up tasks now - umount begin not complete"));
 		wake_up_all(&tcon->ses->server->request_q);
 		wake_up_all(&tcon->ses->server->request_q);
 	}
 	}
 /* BB FIXME - finish add checks for tidStatus BB */
 /* BB FIXME - finish add checks for tidStatus BB */
 
 
 	return;
 	return;
 }
 }
-	
+#endif	
 
 
 static int cifs_remount(struct super_block *sb, int *flags, char *data)
 static int cifs_remount(struct super_block *sb, int *flags, char *data)
 {
 {
@@ -450,7 +453,9 @@ struct super_operations cifs_super_ops = {
    unless later we add lazy close of inodes or unless the kernel forgets to call
    unless later we add lazy close of inodes or unless the kernel forgets to call
    us with the same number of releases (closes) as opens */
    us with the same number of releases (closes) as opens */
 	.show_options = cifs_show_options,
 	.show_options = cifs_show_options,
-/*	.umount_begin   = cifs_umount_begin, */ /* BB finish in the future */
+#ifdef CONFIG_CIFS_EXPERIMENTAL
+	.umount_begin   = cifs_umount_begin,
+#endif
 	.remount_fs = cifs_remount,
 	.remount_fs = cifs_remount,
 };
 };
 
 

+ 1 - 1
fs/cifs/cifsproto.h

@@ -242,11 +242,11 @@ extern int CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon,
 			const int netfid, const unsigned int count,
 			const int netfid, const unsigned int count,
 			const __u64 offset, unsigned int *nbytes, 
 			const __u64 offset, unsigned int *nbytes, 
 			struct kvec *iov, const int nvec, const int long_op);
 			struct kvec *iov, const int nvec, const int long_op);
+#endif /* CONFIG_CIFS_EXPERIMENTAL */
 extern int CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon,
 extern int CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon,
 			const unsigned char *searchName, __u64 * inode_number,
 			const unsigned char *searchName, __u64 * inode_number,
 			const struct nls_table *nls_codepage, 
 			const struct nls_table *nls_codepage, 
 			int remap_special_chars);
 			int remap_special_chars);
-#endif /* CONFIG_CIFS_EXPERIMENTAL */
 extern int cifs_convertUCSpath(char *target, const __le16 *source, int maxlen,
 extern int cifs_convertUCSpath(char *target, const __le16 *source, int maxlen,
 			const struct nls_table * codepage);
 			const struct nls_table * codepage);
 extern int cifsConvertToUCS(__le16 * target, const char *source, int maxlen,
 extern int cifsConvertToUCS(__le16 * target, const char *source, int maxlen,

+ 0 - 2
fs/cifs/cifssmb.c

@@ -2959,7 +2959,6 @@ CIFSFindClose(const int xid, struct cifsTconInfo *tcon, const __u16 searchHandle
 	return rc;
 	return rc;
 }
 }
 
 
-#ifdef CONFIG_CIFS_EXPERIMENTAL
 int
 int
 CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon,
 CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon,
                 const unsigned char *searchName,
                 const unsigned char *searchName,
@@ -3053,7 +3052,6 @@ GetInodeNumOut:
 		goto GetInodeNumberRetry;
 		goto GetInodeNumberRetry;
 	return rc;
 	return rc;
 }
 }
-#endif /* CIFS_EXPERIMENTAL */
 
 
 int
 int
 CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,
 CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,

+ 37 - 0
fs/cifs/cn_cifs.h

@@ -0,0 +1,37 @@
+/*
+ *   fs/cifs/cn_cifs.h
+ *
+ *   Copyright (c) International Business Machines  Corp., 2002
+ *   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
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef _CN_CIFS_H
+#define _CN_CIFS_H
+#ifdef CONFIG_CIFS_UPCALL
+#include <linux/types.h>
+#include <linux/connector.h>
+
+struct cifs_upcall {
+	char signature[4]; /* CIFS */
+	enum command {
+		CIFS_GET_IP = 0x00000001,   /* get ip address for hostname */
+		CIFS_GET_SECBLOB = 0x00000002, /* get SPNEGO wrapped blob */
+	} command;
+	/* union cifs upcall data follows */
+};
+#endif /* CIFS_UPCALL */
+#endif /* _CN_CIFS_H */

+ 1 - 0
fs/cifs/connect.c

@@ -42,6 +42,7 @@
 #include "ntlmssp.h"
 #include "ntlmssp.h"
 #include "nterr.h"
 #include "nterr.h"
 #include "rfc1002pdu.h"
 #include "rfc1002pdu.h"
+#include "cn_cifs.h"
 
 
 #define CIFS_PORT 445
 #define CIFS_PORT 445
 #define RFC1001_PORT 139
 #define RFC1001_PORT 139

+ 0 - 2
fs/cifs/inode.c

@@ -283,7 +283,6 @@ int cifs_get_inode_info(struct inode **pinode,
 			   there Windows server or network appliances for which
 			   there Windows server or network appliances for which
 			   IndexNumber field is not guaranteed unique? */
 			   IndexNumber field is not guaranteed unique? */
 
 
-#ifdef CONFIG_CIFS_EXPERIMENTAL		
 			if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM){
 			if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM){
 				int rc1 = 0;
 				int rc1 = 0;
 				__u64 inode_num;
 				__u64 inode_num;
@@ -299,7 +298,6 @@ int cifs_get_inode_info(struct inode **pinode,
 				} else /* do we need cast or hash to ino? */
 				} else /* do we need cast or hash to ino? */
 					(*pinode)->i_ino = inode_num;
 					(*pinode)->i_ino = inode_num;
 			} /* else ino incremented to unique num in new_inode*/
 			} /* else ino incremented to unique num in new_inode*/
-#endif /* CIFS_EXPERIMENTAL */
 			insert_inode_hash(*pinode);
 			insert_inode_hash(*pinode);
 		}
 		}
 		inode = *pinode;
 		inode = *pinode;

+ 2 - 0
include/linux/connector.h

@@ -32,6 +32,8 @@
  */
  */
 #define CN_IDX_PROC			0x1
 #define CN_IDX_PROC			0x1
 #define CN_VAL_PROC			0x1
 #define CN_VAL_PROC			0x1
+#define CN_IDX_CIFS			0x2
+#define CN_VAL_CIFS                     0x1
 
 
 #define CN_NETLINK_USERS		1
 #define CN_NETLINK_USERS		1