Commit 5e04e7fe authored by Linus Torvalds's avatar Linus Torvalds
parents a5cf8b7d 1b397f4f
...@@ -1601,9 +1601,10 @@ config CIFS ...@@ -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 server support for Linux and many other operating systems). Limited
you must use the smbfs client filesystem to access older SMB servers support for Windows ME and similar servers is provided as well.
such as Windows 9x and OS/2. 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 ...@@ -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 ...@@ -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
...@@ -1640,7 +1655,7 @@ config CIFS_XATTR ...@@ -1640,7 +1655,7 @@ config CIFS_XATTR
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 ...@@ -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 Enables an upcall mechanism for CIFS which will be used to contact
are highly experimental. If unsure, say N. 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)"
......
...@@ -2,7 +2,7 @@ Version 1.39 ...@@ -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
------------ ------------
......
...@@ -74,10 +74,11 @@ cifs_strtoUCS(wchar_t * to, const char *from, int len, ...@@ -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]);
} }
......
...@@ -405,6 +405,7 @@ static struct quotactl_ops cifs_quotactl_ops = { ...@@ -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) ...@@ -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 = { ...@@ -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,
}; };
......
...@@ -242,11 +242,11 @@ extern int CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon, ...@@ -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,
......
...@@ -2959,7 +2959,6 @@ CIFSFindClose(const int xid, struct cifsTconInfo *tcon, const __u16 searchHandle ...@@ -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: ...@@ -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,
......
/*
* 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 */
...@@ -42,6 +42,7 @@ ...@@ -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
......
...@@ -283,7 +283,6 @@ int cifs_get_inode_info(struct inode **pinode, ...@@ -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, ...@@ -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;
......
...@@ -32,6 +32,8 @@ ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment