# SPDX-License-Identifier: GPL-2.0-only

config EROFS_FS
	tristate "EROFS filesystem support"
	depends on BLOCK
	select FS_IOMAP
	select LIBCRC32C
	help
	  EROFS (Enhanced Read-Only File System) is a lightweight read-only
	  file system with modern designs (e.g. no buffer heads, inline
	  xattrs/data, chunk-based deduplication, multiple devices, etc.) for
	  scenarios which need high-performance read-only solutions, e.g.
	  smartphones with Android OS, LiveCDs and high-density hosts with
	  numerous containers;

	  It also provides fixed-sized output compression support in order to
	  improve storage density as well as keep relatively higher compression
	  ratios and implements in-place decompression to reuse the file page
	  for compressed data temporarily with proper strategies, which is
	  quite useful to ensure guaranteed end-to-end runtime decompression
	  performance under extremely memory pressure without extra cost.

	  See the documentation at <file:Documentation/filesystems/erofs.rst>
	  and the web pages at <https://erofs.docs.kernel.org> for more details.

	  If unsure, say N.

config EROFS_FS_DEBUG
	bool "EROFS debugging feature"
	depends on EROFS_FS
	help
	  Print debugging messages and enable more BUG_ONs which check
	  filesystem consistency and find potential issues aggressively,
	  which can be used for Android eng build, for example.

	  For daily use, say N.

config EROFS_FS_XATTR
	bool "EROFS extended attributes"
	depends on EROFS_FS
	select XXHASH
	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.

config EROFS_FS_POSIX_ACL
	bool "EROFS Access Control Lists"
	depends on EROFS_FS_XATTR
	select FS_POSIX_ACL
	default y
	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 EROFS_FS_SECURITY
	bool "EROFS Security Labels"
	depends on EROFS_FS_XATTR
	default y
	help
	  Security labels provide an access control facility to support Linux
	  Security Models (LSMs) accepted by AppArmor, SELinux, Smack and TOMOYO
	  Linux. This option enables an extended attribute handler for file
	  security labels in the erofs filesystem, so that it requires enabling
	  the extended attribute support in advance.

	  If you are not using a security module, say N.

config EROFS_FS_BACKED_BY_FILE
	bool "File-backed EROFS filesystem support"
	depends on EROFS_FS
	default y
	help
	  This allows EROFS to use filesystem image files directly, without
	  the intercession of loopback block devices or likewise. It is
	  particularly useful for container images with numerous blobs and
	  other sandboxes, where loop devices behave intricately.  It can also
	  be used to simplify error-prone lifetime management of unnecessary
	  virtual block devices.

	  Note that this feature, along with ongoing fanotify pre-content
	  hooks, will eventually replace "EROFS over fscache."

	  If you don't want to enable this feature, say N.

config EROFS_FS_ZIP
	bool "EROFS Data Compression Support"
	depends on EROFS_FS
	select LZ4_DECOMPRESS
	default y
	help
	  Enable fixed-sized output compression for EROFS.

	  If you don't want to enable compression feature, say N.

config EROFS_FS_ZIP_LZMA
	bool "EROFS LZMA compressed data support"
	depends on EROFS_FS_ZIP
	select XZ_DEC
	select XZ_DEC_MICROLZMA
	help
	  Saying Y here includes support for reading EROFS file systems
	  containing LZMA compressed data, specifically called microLZMA. It
	  gives better compression ratios than the default LZ4 format, at the
	  expense of more CPU overhead.

	  If unsure, say N.

config EROFS_FS_ZIP_DEFLATE
	bool "EROFS DEFLATE compressed data support"
	depends on EROFS_FS_ZIP
	select ZLIB_INFLATE
	help
	  Saying Y here includes support for reading EROFS file systems
	  containing DEFLATE compressed data.  It gives better compression
	  ratios than the default LZ4 format, while it costs more CPU
	  overhead.

	  DEFLATE support is an experimental feature for now and so most
	  file systems will be readable without selecting this option.

	  If unsure, say N.

config EROFS_FS_ZIP_ZSTD
	bool "EROFS Zstandard compressed data support"
	depends on EROFS_FS_ZIP
	select ZSTD_DECOMPRESS
	help
	  Saying Y here includes support for reading EROFS file systems
	  containing Zstandard compressed data.  It gives better compression
	  ratios than the default LZ4 format, while it costs more CPU
	  overhead.

	  Zstandard support is an experimental feature for now and so most
	  file systems will be readable without selecting this option.

	  If unsure, say N.

config EROFS_FS_ONDEMAND
	bool "EROFS fscache-based on-demand read support (deprecated)"
	depends on EROFS_FS
	select NETFS_SUPPORT
	select FSCACHE
	select CACHEFILES
	select CACHEFILES_ONDEMAND
	help
	  This permits EROFS to use fscache-backed data blobs with on-demand
	  read support.

	  It is now deprecated and scheduled to be removed from the kernel
	  after fanotify pre-content hooks are landed.

	  If unsure, say N.

config EROFS_FS_PCPU_KTHREAD
	bool "EROFS per-cpu decompression kthread workers"
	depends on EROFS_FS_ZIP
	help
	  Saying Y here enables per-CPU kthread workers pool to carry out
	  async decompression for low latencies on some architectures.

	  If unsure, say N.

config EROFS_FS_PCPU_KTHREAD_HIPRI
	bool "EROFS high priority per-CPU kthread workers"
	depends on EROFS_FS_ZIP && EROFS_FS_PCPU_KTHREAD
	default y
	help
	  This permits EROFS to configure per-CPU kthread workers to run
	  at higher priority.

	  If unsure, say N.
