# SPDX-License-Identifier: GPL-2.0-only
config OVERLAY_FS
	tristate "Overlay filesystem support"
	select FS_STACK
	select EXPORTFS
	help
	  An overlay filesystem combines two filesystems - an 'upper' filesystem
	  and a 'lower' filesystem.  When a name exists in both filesystems, the
	  object in the 'upper' filesystem is visible while the object in the
	  'lower' filesystem is either hidden or, in the case of directories,
	  merged with the 'upper' object.

	  For more information see Documentation/filesystems/overlayfs.rst

config OVERLAY_FS_REDIRECT_DIR
	bool "Overlayfs: turn on redirect directory feature by default"
	depends on OVERLAY_FS
	help
	  If this config option is enabled then overlay filesystems will use
	  redirects when renaming directories by default.  In this case it is
	  still possible to turn off redirects globally with the
	  "redirect_dir=off" module option or on a filesystem instance basis
	  with the "redirect_dir=off" mount option.

	  Note, that redirects are not backward compatible.  That is, mounting
	  an overlay which has redirects on a kernel that doesn't support this
	  feature will have unexpected results.

	  If unsure, say N.

config OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW
	bool "Overlayfs: follow redirects even if redirects are turned off"
	default y
	depends on OVERLAY_FS
	help
	  Disable this to get a possibly more secure configuration, but that
	  might not be backward compatible with previous kernels.

	  If backward compatibility is not an issue, then it is safe and
	  recommended to say N here.

	  For more information, see Documentation/filesystems/overlayfs.rst

	  If unsure, say Y.

config OVERLAY_FS_INDEX
	bool "Overlayfs: turn on inodes index feature by default"
	depends on OVERLAY_FS
	help
	  If this config option is enabled then overlay filesystems will use
	  the index directory to map lower inodes to upper inodes by default.
	  In this case it is still possible to turn off index globally with the
	  "index=off" module option or on a filesystem instance basis with the
	  "index=off" mount option.

	  The inodes index feature prevents breaking of lower hardlinks on copy
	  up.

	  Note, that the inodes index feature is not backward compatible.
	  That is, mounting an overlay which has an inodes index on a kernel
	  that doesn't support this feature will have unexpected results.

	  If unsure, say N.

config OVERLAY_FS_NFS_EXPORT
	bool "Overlayfs: turn on NFS export feature by default"
	depends on OVERLAY_FS
	depends on OVERLAY_FS_INDEX
	depends on !OVERLAY_FS_METACOPY
	help
	  If this config option is enabled then overlay filesystems will use
	  the index directory to decode overlay NFS file handles by default.
	  In this case, it is still possible to turn off NFS export support
	  globally with the "nfs_export=off" module option or on a filesystem
	  instance basis with the "nfs_export=off" mount option.

	  The NFS export feature creates an index on copy up of every file and
	  directory.  This full index is used to detect overlay filesystems
	  inconsistencies on lookup, like redirect from multiple upper dirs to
	  the same lower dir.  The full index may incur some overhead on mount
	  time, especially when verifying that directory file handles are not
	  stale.

	  Note, that the NFS export feature is not backward compatible.
	  That is, mounting an overlay which has a full index on a kernel
	  that doesn't support this feature will have unexpected results.

	  Most users should say N here and enable this feature on a case-by-
	  case basis with the "nfs_export=on" mount option.

	  Say N unless you fully understand the consequences.

config OVERLAY_FS_XINO_AUTO
	bool "Overlayfs: auto enable inode number mapping"
	default n
	depends on OVERLAY_FS
	depends on 64BIT
	help
	  If this config option is enabled then overlay filesystems will use
	  unused high bits in underlying filesystem inode numbers to map all
	  inodes to a unified address space.  The mapped 64bit inode numbers
	  might not be compatible with applications that expect 32bit inodes.

	  If compatibility with applications that expect 32bit inodes is not an
	  issue, then it is safe and recommended to say Y here.

	  For more information, see Documentation/filesystems/overlayfs.rst

	  If unsure, say N.

config OVERLAY_FS_METACOPY
	bool "Overlayfs: turn on metadata only copy up feature by default"
	depends on OVERLAY_FS
	select OVERLAY_FS_REDIRECT_DIR
	help
	  If this config option is enabled then overlay filesystems will
	  copy up only metadata where appropriate and data copy up will
	  happen when a file is opened for WRITE operation. It is still
	  possible to turn off this feature globally with the "metacopy=off"
	  module option or on a filesystem instance basis with the
	  "metacopy=off" mount option.

	  Note, that this feature is not backward compatible.  That is,
	  mounting an overlay which has metacopy only inodes on a kernel
	  that doesn't support this feature will have unexpected results.

	  If unsure, say N.

config OVERLAY_FS_DEBUG
	bool "Overlayfs: turn on extra debugging checks"
	default n
	depends on OVERLAY_FS
	help
	  Say Y here to enable extra debugging checks in overlayfs.

	  If unsure, say N.
