# SPDX-License-Identifier: GPL-2.0
#
# Block layer core configuration
#
menuconfig BLOCK
       bool "Enable the block layer" if EXPERT
       default y
       select FS_IOMAP
       select SBITMAP
       help
	 Provide block layer support for the kernel.

	 Disable this option to remove the block layer support from the
	 kernel. This may be useful for embedded devices.

	 If this option is disabled:

	   - block device files will become unusable
	   - some filesystems (such as ext3) will become unavailable.

	 Also, SCSI character devices and USB storage will be disabled since
	 they make use of various block layer definitions and facilities.

	 Say Y here unless you know you really don't want to mount disks and
	 suchlike.

if BLOCK

config BLOCK_LEGACY_AUTOLOAD
	bool "Legacy autoloading support"
	default y
	help
	  Enable loading modules and creating block device instances based on
	  accesses through their device special file.  This is a historic Linux
	  feature and makes no sense in a udev world where device files are
	  created on demand, but scripts that manually create device nodes and
	  then call losetup might rely on this behavior.

config BLK_RQ_ALLOC_TIME
	bool

config BLK_CGROUP_RWSTAT
	bool

config BLK_CGROUP_PUNT_BIO
	bool

config BLK_DEV_BSG_COMMON
	tristate

config BLK_ICQ
	bool

config BLK_DEV_BSGLIB
	bool "Block layer SG support v4 helper lib"
	select BLK_DEV_BSG_COMMON
	help
	  Subsystems will normally enable this if needed. Users will not
	  normally need to manually enable this.

	  If unsure, say N.

config BLK_DEV_INTEGRITY
	bool "Block layer data integrity support"
	help
	Some storage devices allow extra information to be
	stored/retrieved to help protect the data.  The block layer
	data integrity option provides hooks which can be used by
	filesystems to ensure better data integrity.

	Say yes here if you have a storage device that provides the
	T10/SCSI Data Integrity Field or the T13/ATA External Path
	Protection.  If in doubt, say N.

config BLK_DEV_INTEGRITY_T10
	tristate
	depends on BLK_DEV_INTEGRITY
	select CRC_T10DIF
	select CRC64_ROCKSOFT

config BLK_DEV_WRITE_MOUNTED
	bool "Allow writing to mounted block devices"
	default y
	help
	When a block device is mounted, writing to its buffer cache is very
	likely going to cause filesystem corruption. It is also rather easy to
	crash the kernel in this way since the filesystem has no practical way
	of detecting these writes to buffer cache and verifying its metadata
	integrity. However there are some setups that need this capability
	like running fsck on read-only mounted root device, modifying some
	features on mounted ext4 filesystem, and similar. If you say N, the
	kernel will prevent processes from writing to block devices that are
	mounted by filesystems which provides some more protection from runaway
	privileged processes and generally makes it much harder to crash
	filesystem drivers. Note however that this does not prevent
	underlying device(s) from being modified by other means, e.g. by
	directly submitting SCSI commands or through access to lower layers of
	storage stack. If in doubt, say Y. The configuration can be overridden
	with the bdev_allow_write_mounted boot option.

config BLK_DEV_ZONED
	bool "Zoned block device support"
	help
	Block layer zoned block device support. This option enables
	support for ZAC/ZBC/ZNS host-managed and host-aware zoned block
	devices.

	Say yes here if you have a ZAC, ZBC, or ZNS storage device.

config BLK_DEV_THROTTLING
	bool "Block layer bio throttling support"
	depends on BLK_CGROUP
	select BLK_CGROUP_RWSTAT
	help
	Block layer bio throttling support. It can be used to limit
	the IO rate to a device. IO rate policies are per cgroup and
	one needs to mount and use blkio cgroup controller for creating
	cgroups and specifying per device IO rate policies.

	See Documentation/admin-guide/cgroup-v1/blkio-controller.rst for more information.

config BLK_WBT
	bool "Enable support for block device writeback throttling"
	help
	Enabling this option enables the block layer to throttle buffered
	background writeback from the VM, making it more smooth and having
	less impact on foreground operations. The throttling is done
	dynamically on an algorithm loosely based on CoDel, factoring in
	the realtime performance of the disk.

config BLK_WBT_MQ
	bool "Enable writeback throttling by default"
	default y
	depends on BLK_WBT
	help
	Enable writeback throttling by default for request-based block devices.

config BLK_CGROUP_IOLATENCY
	bool "Enable support for latency based cgroup IO protection"
	depends on BLK_CGROUP
	help
	Enabling this option enables the .latency interface for IO throttling.
	The IO controller will attempt to maintain average IO latencies below
	the configured latency target, throttling anybody with a higher latency
	target than the victimized group.

	Note, this is an experimental interface and could be changed someday.

config BLK_CGROUP_FC_APPID
	bool "Enable support to track FC I/O Traffic across cgroup applications"
	depends on BLK_CGROUP && NVME_FC
	help
	  Enabling this option enables the support to track FC I/O traffic across
	  cgroup applications. It enables the Fabric and the storage targets to
	  identify, monitor, and handle FC traffic based on VM tags by inserting
	  application specific identification into the FC frame.

config BLK_CGROUP_IOCOST
	bool "Enable support for cost model based cgroup IO controller"
	depends on BLK_CGROUP
	select BLK_RQ_ALLOC_TIME
	help
	Enabling this option enables the .weight interface for cost
	model based proportional IO control.  The IO controller
	distributes IO capacity between different groups based on
	their share of the overall weight distribution.

config BLK_CGROUP_IOPRIO
	bool "Cgroup I/O controller for assigning an I/O priority class"
	depends on BLK_CGROUP
	help
	Enable the .prio interface for assigning an I/O priority class to
	requests. The I/O priority class affects the order in which an I/O
	scheduler and block devices process requests. Only some I/O schedulers
	and some block devices support I/O priorities.

config BLK_DEBUG_FS
	bool "Block layer debugging information in debugfs"
	default y
	depends on DEBUG_FS
	help
	Include block layer debugging information in debugfs. This information
	is mostly useful for kernel developers, but it doesn't incur any cost
	at runtime.

	Unless you are building a kernel for a tiny system, you should
	say Y here.

config BLK_SED_OPAL
	bool "Logic for interfacing with Opal enabled SEDs"
	depends on KEYS
	select PSERIES_PLPKS if PPC_PSERIES
	select PSERIES_PLPKS_SED if PPC_PSERIES
	help
	Builds Logic for interfacing with Opal enabled controllers.
	Enabling this option enables users to setup/unlock/lock
	Locking ranges for SED devices using the Opal protocol.

config BLK_INLINE_ENCRYPTION
	bool "Enable inline encryption support in block layer"
	help
	  Build the blk-crypto subsystem. Enabling this lets the
	  block layer handle encryption, so users can take
	  advantage of inline encryption hardware if present.

config BLK_INLINE_ENCRYPTION_FALLBACK
	bool "Enable crypto API fallback for blk-crypto"
	depends on BLK_INLINE_ENCRYPTION
	select CRYPTO
	select CRYPTO_SKCIPHER
	help
	  Enabling this lets the block layer handle inline encryption
	  by falling back to the kernel crypto API when inline
	  encryption hardware is not present.

source "block/partitions/Kconfig"

config BLK_MQ_PCI
	def_bool PCI

config BLK_MQ_VIRTIO
	bool
	depends on VIRTIO
	default y

config BLK_PM
	def_bool PM

# do not use in new code
config BLOCK_HOLDER_DEPRECATED
	bool

config BLK_MQ_STACKING
	bool

source "block/Kconfig.iosched"

endif # BLOCK
