# Ext3 configs are here for backward compatibility with old configs which may
# have EXT3_FS set but not EXT4_FS set and thus would result in non-bootable
# kernels after the removal of ext3 driver.
config EXT3_FS
	tristate "The Extended 3 (ext3) filesystem"
	# These must match EXT4_FS selects...
	select EXT4_FS
	select JBD2
	select CRC16
	select CRYPTO
	select CRYPTO_CRC32C
	help
	  This config option is here only for backward compatibility. ext3
	  filesystem is now handled by the ext4 driver.

config EXT3_FS_POSIX_ACL
	bool "Ext3 POSIX Access Control Lists"
	depends on EXT3_FS
	select EXT4_FS_POSIX_ACL
	select FS_POSIX_ACL
	help
	  This config option is here only for backward compatibility. ext3
	  filesystem is now handled by the ext4 driver.

config EXT3_FS_SECURITY
	bool "Ext3 Security Labels"
	depends on EXT3_FS
	select EXT4_FS_SECURITY
	help
	  This config option is here only for backward compatibility. ext3
	  filesystem is now handled by the ext4 driver.

config EXT4_FS
	tristate "The Extended 4 (ext4) filesystem"
	# Please update EXT3_FS selects when changing these
	select JBD2
	select CRC16
	select CRYPTO
	select CRYPTO_CRC32C
	select FS_IOMAP
	select FS_ENCRYPTION_ALGS if FS_ENCRYPTION
	help
	  This is the next generation of the ext3 filesystem.

	  Unlike the change from ext2 filesystem to ext3 filesystem,
	  the on-disk format of ext4 is not forwards compatible with
	  ext3; it is based on extent maps and it supports 48-bit
	  physical block numbers.  The ext4 filesystem also supports delayed
	  allocation, persistent preallocation, high resolution time stamps,
	  and a number of other features to improve performance and speed
	  up fsck time.  For more information, please see the web pages at
	  http://ext4.wiki.kernel.org.

	  The ext4 filesystem supports mounting an ext3 filesystem; while there
	  are some performance gains from the delayed allocation and inode
	  table readahead, the best performance gains require enabling ext4
	  features in the filesystem using tune2fs, or formatting a new
	  filesystem as an ext4 filesystem initially. Without explicit enabling
	  of ext4 features, the on disk filesystem format stays fully backward
	  compatible.

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

	  If unsure, say N.

config EXT4_USE_FOR_EXT2
	bool "Use ext4 for ext2 file systems"
	depends on EXT4_FS
	depends on EXT2_FS=n
	default y
	help
	  Allow the ext4 file system driver code to be used for ext2
	  file system mounts.  This allows users to reduce their
	  compiled kernel size by using one file system driver for
	  ext2, ext3, and ext4 file systems.

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

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

config EXT4_FS_SECURITY
	bool "Ext4 Security Labels"
	depends on EXT4_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 ext4 filesystem.

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

config EXT4_ENCRYPTION
	bool "Ext4 Encryption"
	depends on EXT4_FS
	select FS_ENCRYPTION
	help
	  This kconfig symbol is deprecated; now it just selects
	  FS_ENCRYPTION.  Use CONFIG_FS_ENCRYPTION=y in new config
	  files

config EXT4_FS_ENCRYPTION
	bool
	default y
	depends on EXT4_ENCRYPTION

config EXT4_DEBUG
	bool "EXT4 debugging support"
	depends on EXT4_FS
	help
	  Enables run-time debugging support for the ext4 filesystem.

	  If you select Y here, then you will be able to turn on debugging
	  with a command such as:
		echo 1 > /sys/module/ext4/parameters/mballoc_debug
