#
# File system configuration
#

menu "File systems"

if BLOCK

config EXT2_FS
	tristate "Second extended fs support"
	help
	  Ext2 is a standard Linux file system for hard disks.

	  To compile this file system support as a module, choose M here: the
	  module will be called ext2.

	  If unsure, say Y.

config EXT2_FS_XATTR
	bool "Ext2 extended attributes"
	depends on EXT2_FS
	help
	  Extended attributes are name:value pairs associated with inodes by
	  the kernel or by users (see the attr(5) manual page, or visit
	  <http://acl.bestbits.at/> for details).

	  If unsure, say N.

config EXT2_FS_POSIX_ACL
	bool "Ext2 POSIX Access Control Lists"
	depends on EXT2_FS_XATTR
	select FS_POSIX_ACL
	help
	  Posix Access Control Lists (ACLs) support permissions for users and
	  groups beyond the owner/group/world scheme.

	  To learn more about Access Control Lists, visit the Posix ACLs for
	  Linux website <http://acl.bestbits.at/>.

	  If you don't know what Access Control Lists are, say N

config EXT2_FS_SECURITY
	bool "Ext2 Security Labels"
	depends on EXT2_FS_XATTR
	help
	  Security labels support alternative access control models
	  implemented by security modules like SELinux.  This option
	  enables an extended attribute handler for file security
	  labels in the ext2 filesystem.

	  If you are not using a security module that requires using
	  extended attributes for file security labels, say N.

config EXT2_FS_XIP
	bool "Ext2 execute in place support"
	depends on EXT2_FS && MMU
	help
	  Execute in place can be used on memory-backed block devices. If you
	  enable this option, you can select to mount block devices which are
	  capable of this feature without using the page cache.

	  If you do not use a block device that is capable of using this,
	  or if unsure, say N.

config FS_XIP
# execute in place
	bool
	depends on EXT2_FS_XIP
	default y

config EXT3_FS
	tristate "Ext3 journalling file system support"
	select JBD
	help
	  This is the journalling version of the Second extended file system
	  (often called ext3), the de facto standard Linux file system
	  (method to organize files on a storage device) for hard disks.

	  The journalling code included in this driver means you do not have
	  to run e2fsck (file system checker) on your file systems after a
	  crash.  The journal keeps track of any changes that were being made
	  at the time the system crashed, and can ensure that your file system
	  is consistent without the need for a lengthy check.

	  Other than adding the journal to the file system, the on-disk format
	  of ext3 is identical to ext2.  It is possible to freely switch
	  between using the ext3 driver and the ext2 driver, as long as the
	  file system has been cleanly unmounted, or e2fsck is run on the file
	  system.

	  To add a journal on an existing ext2 file system or change the
	  behavior of ext3 file systems, you can use the tune2fs utility ("man
	  tune2fs").  To modify attributes of files and directories on ext3
	  file systems, use chattr ("man chattr").  You need to be using
	  e2fsprogs version 1.20 or later in order to create ext3 journals
	  (available at <http://sourceforge.net/projects/e2fsprogs/>).

	  To compile this file system support as a module, choose M here: the
	  module will be called ext3.

config EXT3_FS_XATTR
	bool "Ext3 extended attributes"
	depends on EXT3_FS
	default y
	help
	  Extended attributes are name:value pairs associated with inodes by
	  the kernel or by users (see the attr(5) manual page, or visit
	  <http://acl.bestbits.at/> for details).

	  If unsure, say N.

	  You need this for POSIX ACL support on ext3.

config EXT3_FS_POSIX_ACL
	bool "Ext3 POSIX Access Control Lists"
	depends on EXT3_FS_XATTR
	select FS_POSIX_ACL
	help
	  Posix Access Control Lists (ACLs) support permissions for users and
	  groups beyond the owner/group/world scheme.

	  To learn more about Access Control Lists, visit the Posix ACLs for
	  Linux website <http://acl.bestbits.at/>.

	  If you don't know what Access Control Lists are, say N

config EXT3_FS_SECURITY
	bool "Ext3 Security Labels"
	depends on EXT3_FS_XATTR
	help
	  Security labels support alternative access control models
	  implemented by security modules like SELinux.  This option
	  enables an extended attribute handler for file security
	  labels in the ext3 filesystem.

	  If you are not using a security module that requires using
	  extended attributes for file security labels, say N.

config EXT4DEV_FS
	tristate "Ext4dev/ext4 extended fs support development (EXPERIMENTAL)"
	depends on EXPERIMENTAL
	select JBD2
	select CRC16
	help
	  Ext4dev is a predecessor filesystem of the next generation
	  extended fs ext4, based on ext3 filesystem code. It will be
	  renamed ext4 fs later, once ext4dev is mature and stabilized.

	  Unlike the change from ext2 filesystem to ext3 filesystem,
	  the on-disk format of ext4dev is not the same as ext3 any more:
	  it is based on extent maps and it supports 48-bit physical block
	  numbers. These combined on-disk format changes will allow
	  ext4dev/ext4 to handle more than 16 TB filesystem volumes --
	  a hard limit that ext3 cannot overcome without changing the
	  on-disk format.

	  Other than extent maps and 48-bit block numbers, ext4dev also is
	  likely to have other new features such as persistent preallocation,
	  high resolution time stamps, and larger file support etc.  These
	  features will be added to ext4dev gradually.

	  To compile this file system support as a module, choose M here. The
	  module will be called ext4dev.

	  If unsure, say N.

config EXT4DEV_FS_XATTR
	bool "Ext4dev extended attributes"
	depends on EXT4DEV_FS
	default y
	help
	  Extended attributes are name:value pairs associated with inodes by
	  the kernel or by users (see the attr(5) manual page, or visit
	  <http://acl.bestbits.at/> for details).

	  If unsure, say N.

	  You need this for POSIX ACL support on ext4dev/ext4.

config EXT4DEV_FS_POSIX_ACL
	bool "Ext4dev POSIX Access Control Lists"
	depends on EXT4DEV_FS_XATTR
	select FS_POSIX_ACL
	help
	  POSIX Access Control Lists (ACLs) support permissions for users and
	  groups beyond the owner/group/world scheme.

	  To learn more about Access Control Lists, visit the POSIX ACLs for
	  Linux website <http://acl.bestbits.at/>.

	  If you don't know what Access Control Lists are, say N

config EXT4DEV_FS_SECURITY
	bool "Ext4dev Security Labels"
	depends on EXT4DEV_FS_XATTR
	help
	  Security labels support alternative access control models
	  implemented by security modules like SELinux.  This option
	  enables an extended attribute handler for file security
	  labels in the ext4dev/ext4 filesystem.

	  If you are not using a security module that requires using
	  extended attributes for file security labels, say N.

config JBD
	tristate
	help
	  This is a generic journalling layer for block devices.  It is
	  currently used by the ext3 and OCFS2 file systems, but it could
	  also be used to add journal support to other file systems or block
	  devices such as RAID or LVM.

	  If you are using the ext3 or OCFS2 file systems, you need to
	  say Y here. If you are not using ext3 OCFS2 then you will probably
	  want to say N.

	  To compile this device as a module, choose M here: the module will be
	  called jbd.  If you are compiling ext3 or OCFS2 into the kernel,
	  you cannot compile this code as a module.

config JBD_DEBUG
	bool "JBD (ext3) debugging support"
	depends on JBD && DEBUG_FS
	help
	  If you are using the ext3 journaled file system (or potentially any
	  other file system/device using JBD), this option allows you to
	  enable debugging output while the system is running, in order to
	  help track down any problems you are having.  By default the
	  debugging output will be turned off.

	  If you select Y here, then you will be able to turn on debugging
	  with "echo N > /sys/kernel/debug/jbd/jbd-debug", where N is a
	  number between 1 and 5, the higher the number, the more debugging
	  output is generated.  To turn debugging off again, do
	  "echo 0 > /sys/kernel/debug/jbd/jbd-debug".

config JBD2
	tristate
	select CRC32
	help
	  This is a generic journaling layer for block devices that support
	  both 32-bit and 64-bit block numbers.  It is currently used by
	  the ext4dev/ext4 filesystem, but it could also be used to add
	  journal support to other file systems or block devices such
	  as RAID or LVM.

	  If you are using ext4dev/ext4, you need to say Y here. If you are not
	  using ext4dev/ext4 then you will probably want to say N.

	  To compile this device as a module, choose M here. The module will be
	  called jbd2.  If you are compiling ext4dev/ext4 into the kernel,
	  you cannot compile this code as a module.

config JBD2_DEBUG
	bool "JBD2 (ext4dev/ext4) debugging support"
	depends on JBD2 && DEBUG_FS
	help
	  If you are using the ext4dev/ext4 journaled file system (or
	  potentially any other filesystem/device using JBD2), this option
	  allows you to enable debugging output while the system is running,
	  in order to help track down any problems you are having.
	  By default, the debugging output will be turned off.

	  If you select Y here, then you will be able to turn on debugging
	  with "echo N > /sys/kernel/debug/jbd2/jbd2-debug", where N is a
	  number between 1 and 5. The higher the number, the more debugging
	  output is generated.  To turn debugging off again, do
	  "echo 0 > /sys/kernel/debug/jbd2/jbd2-debug".

config FS_MBCACHE
# Meta block cache for Extended Attributes (ext2/ext3/ext4)
	tristate
	depends on EXT2_FS_XATTR || EXT3_FS_XATTR || EXT4DEV_FS_XATTR
	default y if EXT2_FS=y || EXT3_FS=y || EXT4DEV_FS=y
	default m if EXT2_FS=m || EXT3_FS=m || EXT4DEV_FS=m

config REISERFS_FS
	tristate "Reiserfs support"
	help
	  Stores not just filenames but the files themselves in a balanced
	  tree.  Uses journalling.

	  Balanced trees are more efficient than traditional file system
	  architectural foundations.

	  In general, ReiserFS is as fast as ext2, but is very efficient with
	  large directories and small files.  Additional patches are needed
	  for NFS and quotas, please see <http://www.namesys.com/> for links.

	  It is more easily extended to have features currently found in
	  database and keyword search systems than block allocation based file
	  systems are.  The next version will be so extended, and will support
	  plugins consistent with our motto ``It takes more than a license to
	  make source code open.''

	  Read <http://www.namesys.com/> to learn more about reiserfs.

	  Sponsored by Threshold Networks, Emusic.com, and Bigstorage.com.

	  If you like it, you can pay us to add new features to it that you
	  need, buy a support contract, or pay us to port it to another OS.

config REISERFS_CHECK
	bool "Enable reiserfs debug mode"
	depends on REISERFS_FS
	help
	  If you set this to Y, then ReiserFS will perform every check it can
	  possibly imagine of its internal consistency throughout its
	  operation.  It will also go substantially slower.  More than once we
	  have forgotten that this was on, and then gone despondent over the
	  latest benchmarks.:-) Use of this option allows our team to go all
	  out in checking for consistency when debugging without fear of its
	  effect on end users.  If you are on the verge of sending in a bug
	  report, say Y and you might get a useful error message.  Almost
	  everyone should say N.

config REISERFS_PROC_INFO
	bool "Stats in /proc/fs/reiserfs"
	depends on REISERFS_FS && PROC_FS
	help
	  Create under /proc/fs/reiserfs a hierarchy of files, displaying
	  various ReiserFS statistics and internal data at the expense of
	  making your kernel or module slightly larger (+8 KB). This also
	  increases the amount of kernel memory required for each mount.
	  Almost everyone but ReiserFS developers and people fine-tuning
	  reiserfs or tracing problems should say N.

config REISERFS_FS_XATTR
	bool "ReiserFS extended attributes"
	depends on REISERFS_FS
	help
	  Extended attributes are name:value pairs associated with inodes by
	  the kernel or by users (see the attr(5) manual page, or visit
	  <http://acl.bestbits.at/> for details).

	  If unsure, say N.

config REISERFS_FS_POSIX_ACL
	bool "ReiserFS POSIX Access Control Lists"
	depends on REISERFS_FS_XATTR
	select FS_POSIX_ACL
	help
	  Posix Access Control Lists (ACLs) support permissions for users and
	  groups beyond the owner/group/world scheme.

	  To learn more about Access Control Lists, visit the Posix ACLs for
	  Linux website <http://acl.bestbits.at/>.

	  If you don't know what Access Control Lists are, say N

config REISERFS_FS_SECURITY
	bool "ReiserFS Security Labels"
	depends on REISERFS_FS_XATTR
	help
	  Security labels support alternative access control models
	  implemented by security modules like SELinux.  This option
	  enables an extended attribute handler for file security
	  labels in the ReiserFS filesystem.

	  If you are not using a security module that requires using
	  extended attributes for file security labels, say N.

config JFS_FS
	tristate "JFS filesystem support"
	select NLS
	help
	  This is a port of IBM's Journaled Filesystem .  More information is
	  available in the file <file:Documentation/filesystems/jfs.txt>.

	  If you do not intend to use the JFS filesystem, say N.

config JFS_POSIX_ACL
	bool "JFS POSIX Access Control Lists"
	depends on JFS_FS
	select FS_POSIX_ACL
	help
	  Posix Access Control Lists (ACLs) support permissions for users and
	  groups beyond the owner/group/world scheme.

	  To learn more about Access Control Lists, visit the Posix ACLs for
	  Linux website <http://acl.bestbits.at/>.

	  If you don't know what Access Control Lists are, say N

config JFS_SECURITY
	bool "JFS Security Labels"
	depends on JFS_FS
	help
	  Security labels support alternative access control models
	  implemented by security modules like SELinux.  This option
	  enables an extended attribute handler for file security
	  labels in the jfs filesystem.

	  If you are not using a security module that requires using
	  extended attributes for file security labels, say N.

config JFS_DEBUG
	bool "JFS debugging"
	depends on JFS_FS
	help
	  If you are experiencing any problems with the JFS filesystem, say
	  Y here.  This will result in additional debugging messages to be
	  written to the system log.  Under normal circumstances, this
	  results in very little overhead.

config JFS_STATISTICS
	bool "JFS statistics"
	depends on JFS_FS
	help
	  Enabling this option will cause statistics from the JFS file system
	  to be made available to the user in the /proc/fs/jfs/ directory.

config FS_POSIX_ACL
# Posix ACL utility routines (for now, only ext2/ext3/jfs/reiserfs)
#
# NOTE: you can implement Posix ACLs without these helpers (XFS does).
# 	Never use this symbol for ifdefs.
#
	bool
	default n

source "fs/xfs/Kconfig"
source "fs/gfs2/Kconfig"

config OCFS2_FS
	tristate "OCFS2 file system support"
	depends on NET && SYSFS
	select CONFIGFS_FS
	select JBD
	select CRC32
	help
	  OCFS2 is a general purpose extent based shared disk cluster file
	  system with many similarities to ext3. It supports 64 bit inode
	  numbers, and has automatically extending metadata groups which may
	  also make it attractive for non-clustered use.

	  You'll want to install the ocfs2-tools package in order to at least
	  get "mount.ocfs2".

	  Project web page:    http://oss.oracle.com/projects/ocfs2
	  Tools web page:      http://oss.oracle.com/projects/ocfs2-tools
	  OCFS2 mailing lists: http://oss.oracle.com/projects/ocfs2/mailman/

	  For more information on OCFS2, see the file
	  <file:Documentation/filesystems/ocfs2.txt>.

config OCFS2_DEBUG_MASKLOG
	bool "OCFS2 logging support"
	depends on OCFS2_FS
	default y
	help
	  The ocfs2 filesystem has an extensive logging system.  The system
	  allows selection of events to log via files in /sys/o2cb/logmask/.
	  This option will enlarge your kernel, but it allows debugging of
	  ocfs2 filesystem issues.

config OCFS2_DEBUG_FS
	bool "OCFS2 expensive checks"
	depends on OCFS2_FS
	default n
	help
	  This option will enable expensive consistency checks. Enable
	  this option for debugging only as it is likely to decrease
	  performance of the filesystem.

config MINIX_FS
	tristate "Minix fs support"
	help
	  Minix is a simple operating system used in many classes about OS's.
	  The minix file system (method to organize files on a hard disk
	  partition or a floppy disk) was the original file system for Linux,
	  but has been superseded by the second extended file system ext2fs.
	  You don't want to use the minix file system on your hard disk
	  because of certain built-in restrictions, but it is sometimes found
	  on older Linux floppy disks.  This option will enlarge your kernel
	  by about 28 KB. If unsure, say N.

	  To compile this file system support as a module, choose M here: the
	  module will be called minix.  Note that the file system of your root
	  partition (the one containing the directory /) cannot be compiled as
	  a module.

config ROMFS_FS
	tristate "ROM file system support"
	---help---
	  This is a very small read-only file system mainly intended for
	  initial ram disks of installation disks, but it could be used for
	  other read-only media as well.  Read
	  <file:Documentation/filesystems/romfs.txt> for details.

	  To compile this file system support as a module, choose M here: the
	  module will be called romfs.  Note that the file system of your
	  root partition (the one containing the directory /) cannot be a
	  module.

	  If you don't know whether you need it, then you don't need it:
	  answer N.

endif

config INOTIFY
	bool "Inotify file change notification support"
	default y
	---help---
	  Say Y here to enable inotify support.  Inotify is a file change
	  notification system and a replacement for dnotify.  Inotify fixes
	  numerous shortcomings in dnotify and introduces several new features
	  including multiple file events, one-shot support, and unmount
	  notification.

	  For more information, see <file:Documentation/filesystems/inotify.txt>

	  If unsure, say Y.

config INOTIFY_USER
	bool "Inotify support for userspace"
	depends on INOTIFY
	default y
	---help---
	  Say Y here to enable inotify support for userspace, including the
	  associated system calls.  Inotify allows monitoring of both files and
	  directories via a single open fd.  Events are read from the file
	  descriptor, which is also select()- and poll()-able.

	  For more information, see <file:Documentation/filesystems/inotify.txt>

	  If unsure, say Y.

config QUOTA
	bool "Quota support"
	help
	  If you say Y here, you will be able to set per user limits for disk
	  usage (also called disk quotas). Currently, it works for the
	  ext2, ext3, and reiserfs file system. ext3 also supports journalled
	  quotas for which you don't need to run quotacheck(8) after an unclean
	  shutdown.
	  For further details, read the Quota mini-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>, or the documentation provided
	  with the quota tools. Probably the quota support is only useful for
	  multi user systems. If unsure, say N.

config QUOTA_NETLINK_INTERFACE
	bool "Report quota messages through netlink interface"
	depends on QUOTA && NET
	help
	  If you say Y here, quota warnings (about exceeding softlimit, reaching
	  hardlimit, etc.) will be reported through netlink interface. If unsure,
	  say Y.

config PRINT_QUOTA_WARNING
	bool "Print quota warnings to console (OBSOLETE)"
	depends on QUOTA
	default y
	help
	  If you say Y here, quota warnings (about exceeding softlimit, reaching
	  hardlimit, etc.) will be printed to the process' controlling terminal.
	  Note that this behavior is currently deprecated and may go away in
	  future. Please use notification via netlink socket instead.

config QFMT_V1
	tristate "Old quota format support"
	depends on QUOTA
	help
	  This quota format was (is) used by kernels earlier than 2.4.22. If
	  you have quota working and you don't want to convert to new quota
	  format say Y here.

config QFMT_V2
	tristate "Quota format v2 support"
	depends on QUOTA
	help
	  This quota format allows using quotas with 32-bit UIDs/GIDs. If you
	  need this functionality say Y here.

config QUOTACTL
	bool
	depends on XFS_QUOTA || QUOTA
	default y

config DNOTIFY
	bool "Dnotify support"
	default y
	help
	  Dnotify is a directory-based per-fd file change notification system
	  that uses signals to communicate events to user-space.  There exist
	  superior alternatives, but some applications may still rely on
	  dnotify.

	  If unsure, say Y.

config AUTOFS_FS
	tristate "Kernel automounter support"
	help
	  The automounter is a tool to automatically mount remote file systems
	  on demand. This implementation is partially kernel-based to reduce
	  overhead in the already-mounted case; this is unlike the BSD
	  automounter (amd), which is a pure user space daemon.

	  To use the automounter you need the user-space tools from the autofs
	  package; you can find the location in <file:Documentation/Changes>.
	  You also want to answer Y to "NFS file system support", below.

	  If you want to use the newer version of the automounter with more
	  features, say N here and say Y to "Kernel automounter v4 support",
	  below.

	  To compile this support as a module, choose M here: the module will be
	  called autofs.

	  If you are not a part of a fairly large, distributed network, you
	  probably do not need an automounter, and can say N here.

config AUTOFS4_FS
	tristate "Kernel automounter version 4 support (also supports v3)"
	help
	  The automounter is a tool to automatically mount remote file systems
	  on demand. This implementation is partially kernel-based to reduce
	  overhead in the already-mounted case; this is unlike the BSD
	  automounter (amd), which is a pure user space daemon.

	  To use the automounter you need the user-space tools from
	  <ftp://ftp.kernel.org/pub/linux/daemons/autofs/v4/>; you also
	  want to answer Y to "NFS file system support", below.

	  To compile this support as a module, choose M here: the module will be
	  called autofs4.  You will need to add "alias autofs autofs4" to your
	  modules configuration file.

	  If you are not a part of a fairly large, distributed network or
	  don't have a laptop which needs to dynamically reconfigure to the
	  local network, you probably do not need an automounter, and can say
	  N here.

config FUSE_FS
	tristate "Filesystem in Userspace support"
	help
	  With FUSE it is possible to implement a fully functional filesystem
	  in a userspace program.

	  There's also companion library: libfuse.  This library along with
	  utilities is available from the FUSE homepage:
	  <http://fuse.sourceforge.net/>

	  See <file:Documentation/filesystems/fuse.txt> for more information.
	  See <file:Documentation/Changes> for needed library/utility version.

	  If you want to develop a userspace FS, or if you want to use
	  a filesystem based on FUSE, answer Y or M.

config GENERIC_ACL
	bool
	select FS_POSIX_ACL

if BLOCK
menu "CD-ROM/DVD Filesystems"

config ISO9660_FS
	tristate "ISO 9660 CDROM file system support"
	help
	  This is the standard file system used on CD-ROMs.  It was previously
	  known as "High Sierra File System" and is called "hsfs" on other
	  Unix systems.  The so-called Rock-Ridge extensions which allow for
	  long Unix filenames and symbolic links are also supported by this
	  driver.  If you have a CD-ROM drive and want to do more with it than
	  just listen to audio CDs and watch its LEDs, say Y (and read
	  <file:Documentation/filesystems/isofs.txt> and the CD-ROM-HOWTO,
	  available from <http://www.tldp.org/docs.html#howto>), thereby
	  enlarging your kernel by about 27 KB; otherwise say N.

	  To compile this file system support as a module, choose M here: the
	  module will be called isofs.

config JOLIET
	bool "Microsoft Joliet CDROM extensions"
	depends on ISO9660_FS
	select NLS
	help
	  Joliet is a Microsoft extension for the ISO 9660 CD-ROM file system
	  which allows for long filenames in unicode format (unicode is the
	  new 16 bit character code, successor to ASCII, which encodes the
	  characters of almost all languages of the world; see
	  <http://www.unicode.org/> for more information).  Say Y here if you
	  want to be able to read Joliet CD-ROMs under Linux.

config ZISOFS
	bool "Transparent decompression extension"
	depends on ISO9660_FS
	select ZLIB_INFLATE
	help
	  This is a Linux-specific extension to RockRidge which lets you store
	  data in compressed form on a CD-ROM and have it transparently
	  decompressed when the CD-ROM is accessed.  See
	  <http://www.kernel.org/pub/linux/utils/fs/zisofs/> for the tools
	  necessary to create such a filesystem.  Say Y here if you want to be
	  able to read such compressed CD-ROMs.

config UDF_FS
	tristate "UDF file system support"
	help
	  This is the new file system used on some CD-ROMs and DVDs. Say Y if
	  you intend to mount DVD discs or CDRW's written in packet mode, or
	  if written to by other UDF utilities, such as DirectCD.
	  Please read <file:Documentation/filesystems/udf.txt>.

	  To compile this file system support as a module, choose M here: the
	  module will be called udf.

	  If unsure, say N.

config UDF_NLS
	bool
	default y
	depends on (UDF_FS=m && NLS) || (UDF_FS=y && NLS=y)

endmenu
endif

if BLOCK
menu "DOS/FAT/NT Filesystems"

config FAT_FS
	tristate
	select NLS
	help
	  If you want to use one of the FAT-based file systems (the MS-DOS and
	  VFAT (Windows 95) file systems), then you must say Y or M here
	  to include FAT support. You will then be able to mount partitions or
	  diskettes with FAT-based file systems and transparently access the
	  files on them, i.e. MSDOS files will look and behave just like all
	  other Unix files.

	  This FAT support is not a file system in itself, it only provides
	  the foundation for the other file systems. You will have to say Y or
	  M to at least one of "MSDOS fs support" or "VFAT fs support" in
	  order to make use of it.

	  Another way to read and write MSDOS floppies and hard drive
	  partitions from within Linux (but not transparently) is with the
	  mtools ("man mtools") program suite. You don't need to say Y here in
	  order to do that.

	  If you need to move large files on floppies between a DOS and a
	  Linux box, say Y here, mount the floppy under Linux with an MSDOS
	  file system and use GNU tar's M option. GNU tar is a program
	  available for Unix and DOS ("man tar" or "info tar").

	  The FAT support will enlarge your kernel by about 37 KB. If unsure,
	  say Y.

	  To compile this as a module, choose M here: the module will be called
	  fat.  Note that if you compile the FAT support as a module, you
	  cannot compile any of the FAT-based file systems into the kernel
	  -- they will have to be modules as well.

config MSDOS_FS
	tristate "MSDOS fs support"
	select FAT_FS
	help
	  This allows you to mount MSDOS partitions of your hard drive (unless
	  they are compressed; to access compressed MSDOS partitions under
	  Linux, you can either use the DOS emulator DOSEMU, described in the
	  DOSEMU-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>, or try dmsdosfs in
	  <ftp://ibiblio.org/pub/Linux/system/filesystems/dosfs/>. If you
	  intend to use dosemu with a non-compressed MSDOS partition, say Y
	  here) and MSDOS floppies. This means that file access becomes
	  transparent, i.e. the MSDOS files look and behave just like all
	  other Unix files.

	  If you have Windows 95 or Windows NT installed on your MSDOS
	  partitions, you should use the VFAT file system (say Y to "VFAT fs
	  support" below), or you will not be able to see the long filenames
	  generated by Windows 95 / Windows NT.

	  This option will enlarge your kernel by about 7 KB. If unsure,
	  answer Y. This will only work if you said Y to "DOS FAT fs support"
	  as well. To compile this as a module, choose M here: the module will
	  be called msdos.

config VFAT_FS
	tristate "VFAT (Windows-95) fs support"
	select FAT_FS
	help
	  This option provides support for normal Windows file systems with
	  long filenames.  That includes non-compressed FAT-based file systems
	  used by Windows 95, Windows 98, Windows NT 4.0, and the Unix
	  programs from the mtools package.

	  The VFAT support enlarges your kernel by about 10 KB and it only
	  works if you said Y to the "DOS FAT fs support" above.  Please read
	  the file <file:Documentation/filesystems/vfat.txt> for details.  If
	  unsure, say Y.

	  To compile this as a module, choose M here: the module will be called
	  vfat.

config FAT_DEFAULT_CODEPAGE
	int "Default codepage for FAT"
	depends on MSDOS_FS || VFAT_FS
	default 437
	help
	  This option should be set to the codepage of your FAT filesystems.
	  It can be overridden with the "codepage" mount option.
	  See <file:Documentation/filesystems/vfat.txt> for more information.

config FAT_DEFAULT_IOCHARSET
	string "Default iocharset for FAT"
	depends on VFAT_FS
	default "iso8859-1"
	help
	  Set this to the default input/output character set you'd
	  like FAT to use. It should probably match the character set
	  that most of your FAT filesystems use, and can be overridden
	  with the "iocharset" mount option for FAT filesystems.
	  Note that "utf8" is not recommended for FAT filesystems.
	  If unsure, you shouldn't set "utf8" here.
	  See <file:Documentation/filesystems/vfat.txt> for more information.

config NTFS_FS
	tristate "NTFS file system support"
	select NLS
	help
	  NTFS is the file system of Microsoft Windows NT, 2000, XP and 2003.

	  Saying Y or M here enables read support.  There is partial, but
	  safe, write support available.  For write support you must also
	  say Y to "NTFS write support" below.

	  There are also a number of user-space tools available, called
	  ntfsprogs.  These include ntfsundelete and ntfsresize, that work
	  without NTFS support enabled in the kernel.

	  This is a rewrite from scratch of Linux NTFS support and replaced
	  the old NTFS code starting with Linux 2.5.11.  A backport to
	  the Linux 2.4 kernel series is separately available as a patch
	  from the project web site.

	  For more information see <file:Documentation/filesystems/ntfs.txt>
	  and <http://linux-ntfs.sourceforge.net/>.

	  To compile this file system support as a module, choose M here: the
	  module will be called ntfs.

	  If you are not using Windows NT, 2000, XP or 2003 in addition to
	  Linux on your computer it is safe to say N.

config NTFS_DEBUG
	bool "NTFS debugging support"
	depends on NTFS_FS
	help
	  If you are experiencing any problems with the NTFS file system, say
	  Y here.  This will result in additional consistency checks to be
	  performed by the driver as well as additional debugging messages to
	  be written to the system log.  Note that debugging messages are
	  disabled by default.  To enable them, supply the option debug_msgs=1
	  at the kernel command line when booting the kernel or as an option
	  to insmod when loading the ntfs module.  Once the driver is active,
	  you can enable debugging messages by doing (as root):
	  echo 1 > /proc/sys/fs/ntfs-debug
	  Replacing the "1" with "0" would disable debug messages.

	  If you leave debugging messages disabled, this results in little
	  overhead, but enabling debug messages results in very significant
	  slowdown of the system.

	  When reporting bugs, please try to have available a full dump of
	  debugging messages while the misbehaviour was occurring.

config NTFS_RW
	bool "NTFS write support"
	depends on NTFS_FS
	help
	  This enables the partial, but safe, write support in the NTFS driver.

	  The only supported operation is overwriting existing files, without
	  changing the file length.  No file or directory creation, deletion or
	  renaming is possible.  Note only non-resident files can be written to
	  so you may find that some very small files (<500 bytes or so) cannot
	  be written to.

	  While we cannot guarantee that it will not damage any data, we have
	  so far not received a single report where the driver would have
	  damaged someones data so we assume it is perfectly safe to use.

	  Note:  While write support is safe in this version (a rewrite from
	  scratch of the NTFS support), it should be noted that the old NTFS
	  write support, included in Linux 2.5.10 and before (since 1997),
	  is not safe.

	  This is currently useful with TopologiLinux.  TopologiLinux is run
	  on top of any DOS/Microsoft Windows system without partitioning your
	  hard disk.  Unlike other Linux distributions TopologiLinux does not
	  need its own partition.  For more information see
	  <http://topologi-linux.sourceforge.net/>

	  It is perfectly safe to say N here.

endmenu
endif

menu "Pseudo filesystems"

config PROC_FS
	bool "/proc file system support" if EMBEDDED
	default y
	help
	  This is a virtual file system providing information about the status
	  of the system. "Virtual" means that it doesn't take up any space on
	  your hard disk: the files are created on the fly by the kernel when
	  you try to access them. Also, you cannot read the files with older
	  version of the program less: you need to use more or cat.

	  It's totally cool; for example, "cat /proc/interrupts" gives
	  information about what the different IRQs are used for at the moment
	  (there is a small number of Interrupt ReQuest lines in your computer
	  that are used by the attached devices to gain the CPU's attention --
	  often a source of trouble if two devices are mistakenly configured
	  to use the same IRQ). The program procinfo to display some
	  information about your system gathered from the /proc file system.

	  Before you can use the /proc file system, it has to be mounted,
	  meaning it has to be given a location in the directory hierarchy.
	  That location should be /proc. A command such as "mount -t proc proc
	  /proc" or the equivalent line in /etc/fstab does the job.

	  The /proc file system is explained in the file
	  <file:Documentation/filesystems/proc.txt> and on the proc(5) manpage
	  ("man 5 proc").

	  This option will enlarge your kernel by about 67 KB. Several
	  programs depend on this, so everyone should say Y here.

config PROC_KCORE
	bool "/proc/kcore support" if !ARM
	depends on PROC_FS && MMU

config PROC_VMCORE
        bool "/proc/vmcore support (EXPERIMENTAL)"
        depends on PROC_FS && EXPERIMENTAL && CRASH_DUMP
	default y
        help
        Exports the dump image of crashed kernel in ELF format.

config PROC_SYSCTL
	bool "Sysctl support (/proc/sys)" if EMBEDDED
	depends on PROC_FS
	select SYSCTL
	default y
	---help---
	  The sysctl interface provides a means of dynamically changing
	  certain kernel parameters and variables on the fly without requiring
	  a recompile of the kernel or reboot of the system.  The primary
	  interface is through /proc/sys.  If you say Y here a tree of
	  modifiable sysctl entries will be generated beneath the
          /proc/sys directory. They are explained in the files
	  in <file:Documentation/sysctl/>.  Note that enabling this
	  option will enlarge the kernel by at least 8 KB.

	  As it is generally a good thing, you should say Y here unless
	  building a kernel for install/rescue disks or your system is very
	  limited in memory.

config SYSFS
	bool "sysfs file system support" if EMBEDDED
	default y
	help
	The sysfs filesystem is a virtual filesystem that the kernel uses to
	export internal kernel objects, their attributes, and their
	relationships to one another.

	Users can use sysfs to ascertain useful information about the running
	kernel, such as the devices the kernel has discovered on each bus and
	which driver each is bound to. sysfs can also be used to tune devices
	and other kernel subsystems.

	Some system agents rely on the information in sysfs to operate.
	/sbin/hotplug uses device and object attributes in sysfs to assist in
	delegating policy decisions, like persistently naming devices.

	sysfs is currently used by the block subsystem to mount the root
	partition.  If sysfs is disabled you must specify the boot device on
	the kernel boot command line via its major and minor numbers.  For
	example, "root=03:01" for /dev/hda1.

	Designers of embedded systems may wish to say N here to conserve space.

config TMPFS
	bool "Virtual memory file system support (former shm fs)"
	help
	  Tmpfs is a file system which keeps all files in virtual memory.

	  Everything in tmpfs is temporary in the sense that no files will be
	  created on your hard drive. The files live in memory and swap
	  space. If you unmount a tmpfs instance, everything stored therein is
	  lost.

	  See <file:Documentation/filesystems/tmpfs.txt> for details.

config TMPFS_POSIX_ACL
	bool "Tmpfs POSIX Access Control Lists"
	depends on TMPFS
	select GENERIC_ACL
	help
	  POSIX Access Control Lists (ACLs) support permissions for users and
	  groups beyond the owner/group/world scheme.

	  To learn more about Access Control Lists, visit the POSIX ACLs for
	  Linux website <http://acl.bestbits.at/>.

	  If you don't know what Access Control Lists are, say N.

config HUGETLBFS
	bool "HugeTLB file system support"
	depends on X86 || IA64 || PPC64 || SPARC64 || (SUPERH && MMU) || BROKEN
	help
	  hugetlbfs is a filesystem backing for HugeTLB pages, based on
	  ramfs. For architectures that support it, say Y here and read
	  <file:Documentation/vm/hugetlbpage.txt> for details.

	  If unsure, say N.

config HUGETLB_PAGE
	def_bool HUGETLBFS

config CONFIGFS_FS
	tristate "Userspace-driven configuration filesystem"
	depends on SYSFS
	help
	  configfs is a ram-based filesystem that provides the converse
	  of sysfs's functionality. Where sysfs is a filesystem-based
	  view of kernel objects, configfs is a filesystem-based manager
	  of kernel objects, or config_items.

	  Both sysfs and configfs can and should exist together on the
	  same system. One is not a replacement for the other.

endmenu

menu "Miscellaneous filesystems"

config ADFS_FS
	tristate "ADFS file system support (EXPERIMENTAL)"
	depends on BLOCK && EXPERIMENTAL
	help
	  The Acorn Disc Filing System is the standard file system of the
	  RiscOS operating system which runs on Acorn's ARM-based Risc PC
	  systems and the Acorn Archimedes range of machines. If you say Y
	  here, Linux will be able to read from ADFS partitions on hard drives
	  and from ADFS-formatted floppy discs. If you also want to be able to
	  write to those devices, say Y to "ADFS write support" below.

	  The ADFS partition should be the first partition (i.e.,
	  /dev/[hs]d?1) on each of your drives. Please read the file
	  <file:Documentation/filesystems/adfs.txt> for further details.

	  To compile this code as a module, choose M here: the module will be
	  called adfs.

	  If unsure, say N.

config ADFS_FS_RW
	bool "ADFS write support (DANGEROUS)"
	depends on ADFS_FS
	help
	  If you say Y here, you will be able to write to ADFS partitions on
	  hard drives and ADFS-formatted floppy disks. This is experimental
	  codes, so if you're unsure, say N.

config AFFS_FS
	tristate "Amiga FFS file system support (EXPERIMENTAL)"
	depends on BLOCK && EXPERIMENTAL
	help
	  The Fast File System (FFS) is the common file system used on hard
	  disks by Amiga(tm) systems since AmigaOS Version 1.3 (34.20).  Say Y
	  if you want to be able to read and write files from and to an Amiga
	  FFS partition on your hard drive.  Amiga floppies however cannot be
	  read with this driver due to an incompatibility of the floppy
	  controller used in an Amiga and the standard floppy controller in
	  PCs and workstations. Read <file:Documentation/filesystems/affs.txt>
	  and <file:fs/affs/Changes>.

	  With this driver you can also mount disk files used by Bernd
	  Schmidt's Un*X Amiga Emulator
	  (<http://www.freiburg.linux.de/~uae/>).
	  If you want to do this, you will also need to say Y or M to "Loop
	  device support", above.

	  To compile this file system support as a module, choose M here: the
	  module will be called affs.  If unsure, say N.

config ECRYPT_FS
	tristate "eCrypt filesystem layer support (EXPERIMENTAL)"
	depends on EXPERIMENTAL && KEYS && CRYPTO && NET
	help
	  Encrypted filesystem that operates on the VFS layer.  See
	  <file:Documentation/filesystems/ecryptfs.txt> to learn more about
	  eCryptfs.  Userspace components are required and can be
	  obtained from <http://ecryptfs.sf.net>.

	  To compile this file system support as a module, choose M here: the
	  module will be called ecryptfs.

config HFS_FS
	tristate "Apple Macintosh file system support (EXPERIMENTAL)"
	depends on BLOCK && EXPERIMENTAL
	select NLS
	help
	  If you say Y here, you will be able to mount Macintosh-formatted
	  floppy disks and hard drive partitions with full read-write access.
	  Please read <file:Documentation/filesystems/hfs.txt> to learn about
	  the available mount options.

	  To compile this file system support as a module, choose M here: the
	  module will be called hfs.

config HFSPLUS_FS
	tristate "Apple Extended HFS file system support"
	depends on BLOCK
	select NLS
	select NLS_UTF8
	help
	  If you say Y here, you will be able to mount extended format
	  Macintosh-formatted hard drive partitions with full read-write access.

	  This file system is often called HFS+ and was introduced with
	  MacOS 8. It includes all Mac specific filesystem data such as
	  data forks and creator codes, but it also has several UNIX
	  style features such as file ownership and permissions.

config BEFS_FS
	tristate "BeOS file system (BeFS) support (read only) (EXPERIMENTAL)"
	depends on BLOCK && EXPERIMENTAL
	select NLS
	help
	  The BeOS File System (BeFS) is the native file system of Be, Inc's
	  BeOS. Notable features include support for arbitrary attributes
	  on files and directories, and database-like indices on selected
	  attributes. (Also note that this driver doesn't make those features
	  available at this time). It is a 64 bit filesystem, so it supports
	  extremely large volumes and files.

	  If you use this filesystem, you should also say Y to at least one
	  of the NLS (native language support) options below.

	  If you don't know what this is about, say N.

	  To compile this as a module, choose M here: the module will be
	  called befs.

config BEFS_DEBUG
	bool "Debug BeFS"
	depends on BEFS_FS
	help
	  If you say Y here, you can use the 'debug' mount option to enable
	  debugging output from the driver.

config BFS_FS
	tristate "BFS file system support (EXPERIMENTAL)"
	depends on BLOCK && EXPERIMENTAL
	help
	  Boot File System (BFS) is a file system used under SCO UnixWare to
	  allow the bootloader access to the kernel image and other important
	  files during the boot process.  It is usually mounted under /stand
	  and corresponds to the slice marked as "STAND" in the UnixWare
	  partition.  You should say Y if you want to read or write the files
	  on your /stand slice from within Linux.  You then also need to say Y
	  to "UnixWare slices support", below.  More information about the BFS
	  file system is contained in the file
	  <file:Documentation/filesystems/bfs.txt>.

	  If you don't know what this is about, say N.

	  To compile this as a module, choose M here: the module will be called
	  bfs.  Note that the file system of your root partition (the one
	  containing the directory /) cannot be compiled as a module.



config EFS_FS
	tristate "EFS file system support (read only) (EXPERIMENTAL)"
	depends on BLOCK && EXPERIMENTAL
	help
	  EFS is an older file system used for non-ISO9660 CD-ROMs and hard
	  disk partitions by SGI's IRIX operating system (IRIX 6.0 and newer
	  uses the XFS file system for hard disk partitions however).

	  This implementation only offers read-only access. If you don't know
	  what all this is about, it's safe to say N. For more information
	  about EFS see its home page at <http://aeschi.ch.eu.org/efs/>.

	  To compile the EFS file system support as a module, choose M here: the
	  module will be called efs.

config JFFS2_FS
	tristate "Journalling Flash File System v2 (JFFS2) support"
	select CRC32
	depends on MTD
	help
	  JFFS2 is the second generation of the Journalling Flash File System
	  for use on diskless embedded devices. It provides improved wear
	  levelling, compression and support for hard links. You cannot use
	  this on normal block devices, only on 'MTD' devices.

	  Further information on the design and implementation of JFFS2 is
	  available at <http://sources.redhat.com/jffs2/>.

config JFFS2_FS_DEBUG
	int "JFFS2 debugging verbosity (0 = quiet, 2 = noisy)"
	depends on JFFS2_FS
	default "0"
	help
	  This controls the amount of debugging messages produced by the JFFS2
	  code. Set it to zero for use in production systems. For evaluation,
	  testing and debugging, it's advisable to set it to one. This will
	  enable a few assertions and will print debugging messages at the
	  KERN_DEBUG loglevel, where they won't normally be visible. Level 2
	  is unlikely to be useful - it enables extra debugging in certain
	  areas which at one point needed debugging, but when the bugs were
	  located and fixed, the detailed messages were relegated to level 2.

	  If reporting bugs, please try to have available a full dump of the
	  messages at debug level 1 while the misbehaviour was occurring.

config JFFS2_FS_WRITEBUFFER
	bool "JFFS2 write-buffering support"
	depends on JFFS2_FS
	default y
	help
	  This enables the write-buffering support in JFFS2.

	  This functionality is required to support JFFS2 on the following
	  types of flash devices:
	    - NAND flash
	    - NOR flash with transparent ECC
	    - DataFlash

config JFFS2_FS_WBUF_VERIFY
	bool "Verify JFFS2 write-buffer reads"
	depends on JFFS2_FS_WRITEBUFFER
	default n
	help
	  This causes JFFS2 to read back every page written through the
	  write-buffer, and check for errors.

config JFFS2_SUMMARY
	bool "JFFS2 summary support (EXPERIMENTAL)"
	depends on JFFS2_FS && EXPERIMENTAL
	default n
	help
	  This feature makes it possible to use summary information
	  for faster filesystem mount.

	  The summary information can be inserted into a filesystem image
	  by the utility 'sumtool'.

	  If unsure, say 'N'.

config JFFS2_FS_XATTR
	bool "JFFS2 XATTR support (EXPERIMENTAL)"
	depends on JFFS2_FS && EXPERIMENTAL
	default n
	help
	  Extended attributes are name:value pairs associated with inodes by
	  the kernel or by users (see the attr(5) manual page, or visit
	  <http://acl.bestbits.at/> for details).

	  If unsure, say N.

config JFFS2_FS_POSIX_ACL
	bool "JFFS2 POSIX Access Control Lists"
	depends on JFFS2_FS_XATTR
	default y
	select FS_POSIX_ACL
	help
	  Posix Access Control Lists (ACLs) support permissions for users and
	  groups beyond the owner/group/world scheme.

	  To learn more about Access Control Lists, visit the Posix ACLs for
	  Linux website <http://acl.bestbits.at/>.

	  If you don't know what Access Control Lists are, say N

config JFFS2_FS_SECURITY
	bool "JFFS2 Security Labels"
	depends on JFFS2_FS_XATTR
	default y
	help
	  Security labels support alternative access control models
	  implemented by security modules like SELinux.  This option
	  enables an extended attribute handler for file security
	  labels in the jffs2 filesystem.

	  If you are not using a security module that requires using
	  extended attributes for file security labels, say N.

config JFFS2_COMPRESSION_OPTIONS
	bool "Advanced compression options for JFFS2"
	depends on JFFS2_FS
	default n
	help
	  Enabling this option allows you to explicitly choose which
	  compression modules, if any, are enabled in JFFS2. Removing
	  compressors can mean you cannot read existing file systems,
	  and enabling experimental compressors can mean that you
	  write a file system which cannot be read by a standard kernel.

	  If unsure, you should _definitely_ say 'N'.

config JFFS2_ZLIB
	bool "JFFS2 ZLIB compression support" if JFFS2_COMPRESSION_OPTIONS
	select ZLIB_INFLATE
	select ZLIB_DEFLATE
	depends on JFFS2_FS
	default y
	help
	  Zlib is designed to be a free, general-purpose, legally unencumbered,
	  lossless data-compression library for use on virtually any computer
	  hardware and operating system. See <http://www.gzip.org/zlib/> for
	  further information.

	  Say 'Y' if unsure.

config JFFS2_LZO
	bool "JFFS2 LZO compression support" if JFFS2_COMPRESSION_OPTIONS
	select LZO_COMPRESS
	select LZO_DECOMPRESS
	depends on JFFS2_FS
	default n
	help
	  minilzo-based compression. Generally works better than Zlib.

	  This feature was added in July, 2007. Say 'N' if you need
	  compatibility with older bootloaders or kernels.

config JFFS2_RTIME
	bool "JFFS2 RTIME compression support" if JFFS2_COMPRESSION_OPTIONS
	depends on JFFS2_FS
	default y
	help
	  Rtime does manage to recompress already-compressed data. Say 'Y' if unsure.

config JFFS2_RUBIN
	bool "JFFS2 RUBIN compression support" if JFFS2_COMPRESSION_OPTIONS
	depends on JFFS2_FS
	default n
	help
	  RUBINMIPS and DYNRUBIN compressors. Say 'N' if unsure.

choice
	prompt "JFFS2 default compression mode" if JFFS2_COMPRESSION_OPTIONS
	default JFFS2_CMODE_PRIORITY
	depends on JFFS2_FS
	help
	  You can set here the default compression mode of JFFS2 from
	  the available compression modes. Don't touch if unsure.

config JFFS2_CMODE_NONE
	bool "no compression"
	help
	  Uses no compression.

config JFFS2_CMODE_PRIORITY
	bool "priority"
	help
	  Tries the compressors in a predefined order and chooses the first
	  successful one.

config JFFS2_CMODE_SIZE
	bool "size (EXPERIMENTAL)"
	help
	  Tries all compressors and chooses the one which has the smallest
	  result.

config JFFS2_CMODE_FAVOURLZO
	bool "Favour LZO"
	help
	  Tries all compressors and chooses the one which has the smallest
	  result but gives some preference to LZO (which has faster
	  decompression) at the expense of size.

endchoice

config CRAMFS
	tristate "Compressed ROM file system support (cramfs)"
	depends on BLOCK
	select ZLIB_INFLATE
	help
	  Saying Y here includes support for CramFs (Compressed ROM File
	  System).  CramFs is designed to be a simple, small, and compressed
	  file system for ROM based embedded systems.  CramFs is read-only,
	  limited to 256MB file systems (with 16MB files), and doesn't support
	  16/32 bits uid/gid, hard links and timestamps.

	  See <file:Documentation/filesystems/cramfs.txt> and
	  <file:fs/cramfs/README> for further information.

	  To compile this as a module, choose M here: the module will be called
	  cramfs.  Note that the root file system (the one containing the
	  directory /) cannot be compiled as a module.

	  If unsure, say N.

config VXFS_FS
	tristate "FreeVxFS file system support (VERITAS VxFS(TM) compatible)"
	depends on BLOCK
	help
	  FreeVxFS is a file system driver that support the VERITAS VxFS(TM)
	  file system format.  VERITAS VxFS(TM) is the standard file system
	  of SCO UnixWare (and possibly others) and optionally available
	  for Sunsoft Solaris, HP-UX and many other operating systems.
	  Currently only readonly access is supported.

	  NOTE: the file system type as used by mount(1), mount(2) and
	  fstab(5) is 'vxfs' as it describes the file system format, not
	  the actual driver.

	  To compile this as a module, choose M here: the module will be
	  called freevxfs.  If unsure, say N.


config HPFS_FS
	tristate "OS/2 HPFS file system support"
	depends on BLOCK
	help
	  OS/2 is IBM's operating system for PC's, the same as Warp, and HPFS
	  is the file system used for organizing files on OS/2 hard disk
	  partitions. Say Y if you want to be able to read files from and
	  write files to an OS/2 HPFS partition on your hard drive. OS/2
	  floppies however are in regular MSDOS format, so you don't need this
	  option in order to be able to read them. Read
	  <file:Documentation/filesystems/hpfs.txt>.

	  To compile this file system support as a module, choose M here: the
	  module will be called hpfs.  If unsure, say N.



config QNX4FS_FS
	tristate "QNX4 file system support (read only)"
	depends on BLOCK
	help
	  This is the file system used by the real-time operating systems
	  QNX 4 and QNX 6 (the latter is also called QNX RTP).
	  Further information is available at <http://www.qnx.com/>.
	  Say Y if you intend to mount QNX hard disks or floppies.
	  Unless you say Y to "QNX4FS read-write support" below, you will
	  only be able to read these file systems.

	  To compile this file system support as a module, choose M here: the
	  module will be called qnx4.

	  If you don't know whether you need it, then you don't need it:
	  answer N.

config QNX4FS_RW
	bool "QNX4FS write support (DANGEROUS)"
	depends on QNX4FS_FS && EXPERIMENTAL && BROKEN
	help
	  Say Y if you want to test write support for QNX4 file systems.

	  It's currently broken, so for now:
	  answer N.



config SYSV_FS
	tristate "System V/Xenix/V7/Coherent file system support"
	depends on BLOCK
	help
	  SCO, Xenix and Coherent are commercial Unix systems for Intel
	  machines, and Version 7 was used on the DEC PDP-11. Saying Y
	  here would allow you to read from their floppies and hard disk
	  partitions.

	  If you have floppies or hard disk partitions like that, it is likely
	  that they contain binaries from those other Unix systems; in order
	  to run these binaries, you will want to install linux-abi which is
	  a set of kernel modules that lets you run SCO, Xenix, Wyse,
	  UnixWare, Dell Unix and System V programs under Linux.  It is
	  available via FTP (user: ftp) from
	  <ftp://ftp.openlinux.org/pub/people/hch/linux-abi/>).
	  NOTE: that will work only for binaries from Intel-based systems;
	  PDP ones will have to wait until somebody ports Linux to -11 ;-)

	  If you only intend to mount files from some other Unix over the
	  network using NFS, you don't need the System V file system support
	  (but you need NFS file system support obviously).

	  Note that this option is generally not needed for floppies, since a
	  good portable way to transport files and directories between unixes
	  (and even other operating systems) is given by the tar program ("man
	  tar" or preferably "info tar").  Note also that this option has
	  nothing whatsoever to do with the option "System V IPC". Read about
	  the System V file system in
	  <file:Documentation/filesystems/sysv-fs.txt>.
	  Saying Y here will enlarge your kernel by about 27 KB.

	  To compile this as a module, choose M here: the module will be called
	  sysv.

	  If you haven't heard about all of this before, it's safe to say N.



config UFS_FS
	tristate "UFS file system support (read only)"
	depends on BLOCK
	help
	  BSD and derivate versions of Unix (such as SunOS, FreeBSD, NetBSD,
	  OpenBSD and NeXTstep) use a file system called UFS. Some System V
	  Unixes can create and mount hard disk partitions and diskettes using
	  this file system as well. Saying Y here will allow you to read from
	  these partitions; if you also want to write to them, say Y to the
	  experimental "UFS file system write support", below. Please read the
	  file <file:Documentation/filesystems/ufs.txt> for more information.

          The recently released UFS2 variant (used in FreeBSD 5.x) is
          READ-ONLY supported.

	  If you only intend to mount files from some other Unix over the
	  network using NFS, you don't need the UFS file system support (but
	  you need NFS file system support obviously).

	  Note that this option is generally not needed for floppies, since a
	  good portable way to transport files and directories between unixes
	  (and even other operating systems) is given by the tar program ("man
	  tar" or preferably "info tar").

	  When accessing NeXTstep files, you may need to convert them from the
	  NeXT character set to the Latin1 character set; use the program
	  recode ("info recode") for this purpose.

	  To compile the UFS file system support as a module, choose M here: the
	  module will be called ufs.

	  If you haven't heard about all of this before, it's safe to say N.

config UFS_FS_WRITE
	bool "UFS file system write support (DANGEROUS)"
	depends on UFS_FS && EXPERIMENTAL
	help
	  Say Y here if you want to try writing to UFS partitions. This is
	  experimental, so you should back up your UFS partitions beforehand.

config UFS_DEBUG
	bool "UFS debugging"
	depends on UFS_FS
	help
	  If you are experiencing any problems with the UFS filesystem, say
	  Y here.  This will result in _many_ additional debugging messages to be
	  written to the system log.

endmenu

menuconfig NETWORK_FILESYSTEMS
	bool "Network File Systems"
	default y
	depends on NET
	---help---
	  Say Y here to get to see options for network filesystems and
	  filesystem-related networking code, such as NFS daemon and
	  RPCSEC security modules.
	  This option alone does not add any kernel code.

	  If you say N, all options in this submenu will be skipped and
	  disabled; if unsure, say Y here.

if NETWORK_FILESYSTEMS

config NFS_FS
	tristate "NFS file system support"
	depends on INET
	select LOCKD
	select SUNRPC
	select NFS_ACL_SUPPORT if NFS_V3_ACL
	help
	  If you are connected to some other (usually local) Unix computer
	  (using SLIP, PLIP, PPP or Ethernet) and want to mount files residing
	  on that computer (the NFS server) using the Network File Sharing
	  protocol, say Y. "Mounting files" means that the client can access
	  the files with usual UNIX commands as if they were sitting on the
	  client's hard disk. For this to work, the server must run the
	  programs nfsd and mountd (but does not need to have NFS file system
	  support enabled in its kernel). NFS is explained in the Network
	  Administrator's Guide, available from
	  <http://www.tldp.org/docs.html#guide>, on its man page: "man
	  nfs", and in the NFS-HOWTO.

	  A superior but less widely used alternative to NFS is provided by
	  the Coda file system; see "Coda file system support" below.

	  If you say Y here, you should have said Y to TCP/IP networking also.
	  This option would enlarge your kernel by about 27 KB.

	  To compile this file system support as a module, choose M here: the
	  module will be called nfs.

	  If you are configuring a diskless machine which will mount its root
	  file system over NFS at boot time, say Y here and to "Kernel
	  level IP autoconfiguration" above and to "Root file system on NFS"
	  below. You cannot compile this driver as a module in this case.
	  There are two packages designed for booting diskless machines over
	  the net: netboot, available from
	  <http://ftp1.sourceforge.net/netboot/>, and Etherboot,
	  available from <http://ftp1.sourceforge.net/etherboot/>.

	  If you don't know what all this is about, say N.

config NFS_V3
	bool "Provide NFSv3 client support"
	depends on NFS_FS
	help
	  Say Y here if you want your NFS client to be able to speak version
	  3 of the NFS protocol.

	  If unsure, say Y.

config NFS_V3_ACL
	bool "Provide client support for the NFSv3 ACL protocol extension"
	depends on NFS_V3
	help
	  Implement the NFSv3 ACL protocol extension for manipulating POSIX
	  Access Control Lists.  The server should also be compiled with
	  the NFSv3 ACL protocol extension; see the CONFIG_NFSD_V3_ACL option.

	  If unsure, say N.

config NFS_V4
	bool "Provide NFSv4 client support (EXPERIMENTAL)"
	depends on NFS_FS && EXPERIMENTAL
	select RPCSEC_GSS_KRB5
	help
	  Say Y here if you want your NFS client to be able to speak the newer
	  version 4 of the NFS protocol.

	  Note: Requires auxiliary userspace daemons which may be found on
		http://www.citi.umich.edu/projects/nfsv4/

	  If unsure, say N.

config NFS_DIRECTIO
	bool "Allow direct I/O on NFS files"
	depends on NFS_FS
	help
	  This option enables applications to perform uncached I/O on files
	  in NFS file systems using the O_DIRECT open() flag.  When O_DIRECT
	  is set for a file, its data is not cached in the system's page
	  cache.  Data is moved to and from user-level application buffers
	  directly.  Unlike local disk-based file systems, NFS O_DIRECT has
	  no alignment restrictions.

	  Unless your program is designed to use O_DIRECT properly, you are
	  much better off allowing the NFS client to manage data caching for
	  you.  Misusing O_DIRECT can cause poor server performance or network
	  storms.  This kernel build option defaults OFF to avoid exposing
	  system administrators unwittingly to a potentially hazardous
	  feature.

	  For more details on NFS O_DIRECT, see fs/nfs/direct.c.

	  If unsure, say N.  This reduces the size of the NFS client, and
	  causes open() to return EINVAL if a file residing in NFS is
	  opened with the O_DIRECT flag.

config NFSD
	tristate "NFS server support"
	depends on INET
	select LOCKD
	select SUNRPC
	select EXPORTFS
	select NFSD_V2_ACL if NFSD_V3_ACL
	select NFS_ACL_SUPPORT if NFSD_V2_ACL
	select NFSD_TCP if NFSD_V4
	select CRYPTO_MD5 if NFSD_V4
	select CRYPTO if NFSD_V4
	select FS_POSIX_ACL if NFSD_V4
	select PROC_FS if NFSD_V4
	select PROC_FS if SUNRPC_GSS
	help
	  If you want your Linux box to act as an NFS *server*, so that other
	  computers on your local network which support NFS can access certain
	  directories on your box transparently, you have two options: you can
	  use the self-contained user space program nfsd, in which case you
	  should say N here, or you can say Y and use the kernel based NFS
	  server. The advantage of the kernel based solution is that it is
	  faster.

	  In either case, you will need support software; the respective
	  locations are given in the file <file:Documentation/Changes> in the
	  NFS section.

	  If you say Y here, you will get support for version 2 of the NFS
	  protocol (NFSv2). If you also want NFSv3, say Y to the next question
	  as well.

	  Please read the NFS-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>.

	  To compile the NFS server support as a module, choose M here: the
	  module will be called nfsd.  If unsure, say N.

config NFSD_V2_ACL
	bool
	depends on NFSD

config NFSD_V3
	bool "Provide NFSv3 server support"
	depends on NFSD
	help
	  If you would like to include the NFSv3 server as well as the NFSv2
	  server, say Y here.  If unsure, say Y.

config NFSD_V3_ACL
	bool "Provide server support for the NFSv3 ACL protocol extension"
	depends on NFSD_V3
	help
	  Implement the NFSv3 ACL protocol extension for manipulating POSIX
	  Access Control Lists on exported file systems. NFS clients should
	  be compiled with the NFSv3 ACL protocol extension; see the
	  CONFIG_NFS_V3_ACL option.  If unsure, say N.

config NFSD_V4
	bool "Provide NFSv4 server support (EXPERIMENTAL)"
	depends on NFSD && NFSD_V3 && EXPERIMENTAL
	select RPCSEC_GSS_KRB5
	help
	  If you would like to include the NFSv4 server as well as the NFSv2
	  and NFSv3 servers, say Y here.  This feature is experimental, and
	  should only be used if you are interested in helping to test NFSv4.
	  If unsure, say N.

config NFSD_TCP
	bool "Provide NFS server over TCP support"
	depends on NFSD
	default y
	help
	  If you want your NFS server to support TCP connections, say Y here.
	  TCP connections usually perform better than the default UDP when
	  the network is lossy or congested.  If unsure, say Y.

config ROOT_NFS
	bool "Root file system on NFS"
	depends on NFS_FS=y && IP_PNP
	help
	  If you want your Linux box to mount its whole root file system (the
	  one containing the directory /) from some other computer over the
	  net via NFS (presumably because your box doesn't have a hard disk),
	  say Y. Read <file:Documentation/nfsroot.txt> for details. It is
	  likely that in this case, you also want to say Y to "Kernel level IP
	  autoconfiguration" so that your box can discover its network address
	  at boot time.

	  Most people say N here.

config LOCKD
	tristate

config LOCKD_V4
	bool
	depends on NFSD_V3 || NFS_V3
	default y

config EXPORTFS
	tristate

config NFS_ACL_SUPPORT
	tristate
	select FS_POSIX_ACL

config NFS_COMMON
	bool
	depends on NFSD || NFS_FS
	default y

config SUNRPC
	tristate

config SUNRPC_GSS
	tristate

config SUNRPC_XPRT_RDMA
	tristate "RDMA transport for sunrpc (EXPERIMENTAL)"
	depends on SUNRPC && INFINIBAND && EXPERIMENTAL
	default m
	help
	  Adds a client RPC transport for supporting kernel NFS over RDMA
	  mounts, including Infiniband and iWARP. Experimental.

config SUNRPC_BIND34
	bool "Support for rpcbind versions 3 & 4 (EXPERIMENTAL)"
	depends on SUNRPC && EXPERIMENTAL
	help
	  Provides kernel support for querying rpcbind servers via versions 3
	  and 4 of the rpcbind protocol.  The kernel automatically falls back
	  to version 2 if a remote rpcbind service does not support versions
	  3 or 4.

	  If unsure, say N to get traditional behavior (version 2 rpcbind
	  requests only).

config RPCSEC_GSS_KRB5
	tristate "Secure RPC: Kerberos V mechanism (EXPERIMENTAL)"
	depends on SUNRPC && EXPERIMENTAL
	select SUNRPC_GSS
	select CRYPTO
	select CRYPTO_MD5
	select CRYPTO_DES
	select CRYPTO_CBC
	help
	  Provides for secure RPC calls by means of a gss-api
	  mechanism based on Kerberos V5. This is required for
	  NFSv4.

	  Note: Requires an auxiliary userspace daemon which may be found on
		http://www.citi.umich.edu/projects/nfsv4/

	  If unsure, say N.

config RPCSEC_GSS_SPKM3
	tristate "Secure RPC: SPKM3 mechanism (EXPERIMENTAL)"
	depends on SUNRPC && EXPERIMENTAL
	select SUNRPC_GSS
	select CRYPTO
	select CRYPTO_MD5
	select CRYPTO_DES
	select CRYPTO_CAST5
	select CRYPTO_CBC
	help
	  Provides for secure RPC calls by means of a gss-api
	  mechanism based on the SPKM3 public-key mechanism.

	  Note: Requires an auxiliary userspace daemon which may be found on
	  	http://www.citi.umich.edu/projects/nfsv4/

	  If unsure, say N.

config SMB_FS
	tristate "SMB file system support (OBSOLETE, please use CIFS)"
	depends on INET
	select NLS
	help
	  SMB (Server Message Block) is the protocol Windows for Workgroups
	  (WfW), Windows 95/98, Windows NT and OS/2 Lan Manager use to share
	  files and printers over local networks.  Saying Y here allows you to
	  mount their file systems (often called "shares" in this context) and
	  access them just like any other Unix directory.  Currently, this
	  works only if the Windows machines use TCP/IP as the underlying
	  transport protocol, and not NetBEUI.  For details, read
	  <file:Documentation/filesystems/smbfs.txt> and the SMB-HOWTO,
	  available from <http://www.tldp.org/docs.html#howto>.

	  Note: if you just want your box to act as an SMB *server* and make
	  files and printing services available to Windows clients (which need
	  to have a TCP/IP stack), you don't need to say Y here; you can use
	  the program SAMBA (available from <ftp://ftp.samba.org/pub/samba/>)
	  for that.

	  General information about how to connect Linux, Windows machines and
	  Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.

	  To compile the SMB support as a module, choose M here:
	  the module will be called smbfs.  Most people say N, however.

config SMB_NLS_DEFAULT
	bool "Use a default NLS"
	depends on SMB_FS
	help
	  Enabling this will make smbfs use nls translations by default. You
	  need to specify the local charset (CONFIG_NLS_DEFAULT) in the nls
	  settings and you need to give the default nls for the SMB server as
	  CONFIG_SMB_NLS_REMOTE.

	  The nls settings can be changed at mount time, if your smbmount
	  supports that, using the codepage and iocharset parameters.

	  smbmount from samba 2.2.0 or later supports this.

config SMB_NLS_REMOTE
	string "Default Remote NLS Option"
	depends on SMB_NLS_DEFAULT
	default "cp437"
	help
	  This setting allows you to specify a default value for which
	  codepage the server uses. If this field is left blank no
	  translations will be done by default. The local codepage/charset
	  default to CONFIG_NLS_DEFAULT.

	  The nls settings can be changed at mount time, if your smbmount
	  supports that, using the codepage and iocharset parameters.

	  smbmount from samba 2.2.0 or later supports this.

config CIFS
	tristate "CIFS support (advanced network filesystem, SMBFS successor)"
	depends on INET
	select NLS
	help
	  This is the client VFS module for the Common Internet File System
	  (CIFS) protocol which is the successor to the Server Message Block 
	  (SMB) protocol, the native file sharing mechanism for most early
	  PC operating systems.  The CIFS protocol is fully supported by 
	  file servers such as Windows 2000 (including Windows 2003, NT 4  
	  and Windows XP) as well by Samba (which provides excellent CIFS
	  server support for Linux and many other operating systems). Limited
	  support for OS/2 and Windows ME and similar servers is provided as
	  well.

	  The cifs module provides an advanced network file system
	  client for mounting to CIFS compliant servers.  It includes
	  support for DFS (hierarchical name space), secure per-user
	  session establishment via Kerberos or NTLM or NTLMv2,
	  safe distributed caching (oplock), optional packet
	  signing, Unicode and other internationalization improvements.
	  If you need to mount to Samba or Windows from this machine, say Y.

config CIFS_STATS
        bool "CIFS statistics"
        depends on CIFS
        help
          Enabling this option will cause statistics for each server share
	  mounted by the cifs client to be displayed in /proc/fs/cifs/Stats

config CIFS_STATS2
	bool "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_WEAK_PW_HASH
	bool "Support legacy servers which use weaker LANMAN security"
	depends on CIFS
	help
	  Modern CIFS servers including Samba and most Windows versions
	  (since 1997) support stronger NTLM (and even NTLMv2 and Kerberos)
	  security mechanisms. These hash the password more securely
	  than the mechanisms used in the older LANMAN version of the
	  SMB protocol but LANMAN based authentication is needed to
	  establish sessions with some old SMB servers.

	  Enabling this option allows the cifs module to mount to older
	  LANMAN based servers such as OS/2 and Windows 95, but such
	  mounts may be less secure than mounts using NTLM or more recent
	  security mechanisms if you are on a public network.  Unless you
	  have a need to access old SMB servers (and are on a private
	  network) you probably want to say N.  Even if this support
	  is enabled in the kernel build, LANMAN authentication will not be
	  used automatically. At runtime LANMAN mounts are disabled but
	  can be set to required (or optional) either in
	  /proc/fs/cifs (see fs/cifs/README for more detail) or via an
	  option on the mount command. This support is disabled by
	  default in order to reduce the possibility of a downgrade
	  attack.

	  If unsure, say N.

config CIFS_XATTR
        bool "CIFS extended attributes"
        depends on CIFS
        help
          Extended attributes are name:value pairs associated with inodes by
          the kernel or by users (see the attr(5) manual page, or visit
          <http://acl.bestbits.at/> for details).  CIFS maps the name of
          extended attributes beginning with the user namespace prefix
          to SMB/CIFS EAs. EAs are stored on Windows servers without the
          user namespace prefix, but their names are seen by Linux cifs clients
          prefaced by the user namespace prefix. The system namespace
          (used by some filesystems to store ACLs) is not supported at
          this time.

          If unsure, say N.

config CIFS_POSIX
        bool "CIFS POSIX Extensions"
        depends on CIFS_XATTR
        help
          Enabling this option will cause the cifs client to attempt to
	  negotiate a newer dialect with servers, such as Samba 3.0.5
	  or later, that optionally can handle more POSIX like (rather
	  than Windows like) file behavior.  It also enables
	  support for POSIX ACLs (getfacl and setfacl) to servers
	  (such as Samba 3.10 and later) which can negotiate
	  CIFS POSIX ACL support.  If unsure, say N.

config CIFS_DEBUG2
	bool "Enable additional CIFS debugging routines"
	depends on CIFS
	help
	   Enabling this option adds a few more debugging routines
	   to the cifs code which slightly increases the size of
	   the cifs module and can cause additional logging of debug
	   messages in some error paths, slowing performance. This
	   option can be turned off unless you are debugging
	   cifs problems.  If unsure, say N.

config CIFS_EXPERIMENTAL
	  bool "CIFS Experimental Features (EXPERIMENTAL)"
	  depends on CIFS && EXPERIMENTAL
	  help
	    Enables cifs features under testing. These features are
	    experimental and currently include DFS support and directory 
	    change notification ie fcntl(F_DNOTIFY), as well as the upcall
	    mechanism which will be used for Kerberos session negotiation
	    and uid remapping.  Some of these features also may depend on 
	    setting a value of 1 to 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 "Kerberos/SPNEGO advanced session setup (EXPERIMENTAL)"
	  depends on CIFS_EXPERIMENTAL
	  depends on KEYS
	  help
	    Enables an upcall mechanism for CIFS which accesses
	    userspace helper utilities to provide SPNEGO packaged (RFC 4178)
	    Kerberos tickets which are needed to mount to certain secure servers
	    (for which more secure Kerberos authentication is required). If
	    unsure, say N.

config CIFS_DFS_UPCALL
	  bool "DFS feature support (EXPERIMENTAL)"
	  depends on CIFS_EXPERIMENTAL
	  depends on KEYS
	  help
	    Enables an upcall mechanism for CIFS which contacts userspace
	    helper utilities to provide server name resolution (host names to
	    IP addresses) which is needed for implicit mounts of DFS junction
	    points. If unsure, say N.

config NCP_FS
	tristate "NCP file system support (to mount NetWare volumes)"
	depends on IPX!=n || INET
	help
	  NCP (NetWare Core Protocol) is a protocol that runs over IPX and is
	  used by Novell NetWare clients to talk to file servers.  It is to
	  IPX what NFS is to TCP/IP, if that helps.  Saying Y here allows you
	  to mount NetWare file server volumes and to access them just like
	  any other Unix directory.  For details, please read the file
	  <file:Documentation/filesystems/ncpfs.txt> in the kernel source and
	  the IPX-HOWTO from <http://www.tldp.org/docs.html#howto>.

	  You do not have to say Y here if you want your Linux box to act as a
	  file *server* for Novell NetWare clients.

	  General information about how to connect Linux, Windows machines and
	  Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.

	  To compile this as a module, choose M here: the module will be called
	  ncpfs.  Say N unless you are connected to a Novell network.

source "fs/ncpfs/Kconfig"

config CODA_FS
	tristate "Coda file system support (advanced network fs)"
	depends on INET
	help
	  Coda is an advanced network file system, similar to NFS in that it
	  enables you to mount file systems of a remote server and access them
	  with regular Unix commands as if they were sitting on your hard
	  disk.  Coda has several advantages over NFS: support for
	  disconnected operation (e.g. for laptops), read/write server
	  replication, security model for authentication and encryption,
	  persistent client caches and write back caching.

	  If you say Y here, your Linux box will be able to act as a Coda
	  *client*.  You will need user level code as well, both for the
	  client and server.  Servers are currently user level, i.e. they need
	  no kernel support.  Please read
	  <file:Documentation/filesystems/coda.txt> and check out the Coda
	  home page <http://www.coda.cs.cmu.edu/>.

	  To compile the coda client support as a module, choose M here: the
	  module will be called coda.

config CODA_FS_OLD_API
	bool "Use 96-bit Coda file identifiers"
	depends on CODA_FS
	help
	  A new kernel-userspace API had to be introduced for Coda v6.0
	  to support larger 128-bit file identifiers as needed by the
	  new realms implementation.

	  However this new API is not backward compatible with older
	  clients. If you really need to run the old Coda userspace
	  cache manager then say Y.

	  For most cases you probably want to say N.

config AFS_FS
	tristate "Andrew File System support (AFS) (EXPERIMENTAL)"
	depends on INET && EXPERIMENTAL
	select AF_RXRPC
	help
	  If you say Y here, you will get an experimental Andrew File System
	  driver. It currently only supports unsecured read-only AFS access.

	  See <file:Documentation/filesystems/afs.txt> for more information.

	  If unsure, say N.

config AFS_DEBUG
	bool "AFS dynamic debugging"
	depends on AFS_FS
	help
	  Say Y here to make runtime controllable debugging messages appear.

	  See <file:Documentation/filesystems/afs.txt> for more information.

	  If unsure, say N.

config 9P_FS
	tristate "Plan 9 Resource Sharing Support (9P2000) (Experimental)"
	depends on INET && NET_9P && EXPERIMENTAL
	help
	  If you say Y here, you will get experimental support for
	  Plan 9 resource sharing via the 9P2000 protocol.

	  See <http://v9fs.sf.net> for more information.

	  If unsure, say N.

endif # NETWORK_FILESYSTEMS

if BLOCK
menu "Partition Types"

source "fs/partitions/Kconfig"

endmenu
endif

source "fs/nls/Kconfig"
source "fs/dlm/Kconfig"

endmenu
