blob: e5366070c7397264fe95a89f4cbde335dc6f5be8 [file] [log] [blame]
****************
FS Mount options
****************
Prior to kernel 5.8
===================
Prior to kernel 5.8 enabling dax is done on an entire file system basis.
It is done with a "-o dax" mount option.
::
$ mount -o dax /dev/pmem0p1 /mnt/ext4-pmem0
$ mount -o dax /dev/pmem0p2 /mnt/xfs-pmem0
Kernels 5.8 or later
====================
As of kernel 5.8 additional DAX enabling options are available on some
file systems, specifically:
ext2
----
When mounting the filesystem, use the "-o dax" option on the command
line or add 'dax' to the options in /etc/fstab. This works to enable DAX
on all files within the filesystem. It is equivalent to the '-o
dax=always' behavior below.
ext4 and xfs
------------
As of kernel 5.8 ext4 and xfs supports the new per-file dax
configuration.
Summary
~~~~~~~
#. There exists an in-kernel file access mode flag S_DAX that
corresponds to the statx flag STATX_ATTR_DAX. See the manpage for
statx(2) for details about this access mode.
#. There exists a persistent flag FS_XFLAG_DAX that can be applied to
regular files and directories. This advisory flag can be set or
cleared at any time, but doing so does not immediately affect the
S_DAX state.
#. If the persistent FS_XFLAG_DAX flag is set on a directory, this flag
will be inherited by all regular files and subdirectories that are
subsequently created in this directory. Files and subdirectories that
exist at the time this flag is set or cleared on the parent directory
are not modified by this modification of the parent directory.
#. There exist dax mount options which can override FS_XFLAG_DAX in the
setting of the S_DAX flag. Given underlying storage which supports
DAX the following hold:
- "-o dax=inode" means "follow FS_XFLAG_DAX" and is the default.
- "-o dax=never" means "never set S_DAX, ignore FS_XFLAG_DAX."
- "-o dax=always" means "always set S_DAX ignore FS_XFLAG_DAX."
- "-o dax" is a legacy option which is an alias for "dax=always".
- *"-o dax" may be removed in the future so "-o dax=always" is
the preferred method for specifying this behavior going
forward.*
#. The S_DAX policy can be changed via:
#. Setting the parent directory FS_XFLAG_DAX as needed before files
are created
#. Setting the appropriate dax="foo" mount option
#. Changing the FS_XFLAG_DAX flag on existing regular files and
directories. This has runtime constraints and limitations that are
described in 6) below.
#. When changing the S_DAX policy via toggling the persistent
FS_XFLAG_DAX flag, the change in behaviour for existing regular files
may not occur immediately. If the change must take effect
immediately, the administrator needs to:
#. stop the application so there are no active references to the data
set the policy change will affect
#. evict the data set from kernel caches so it will be
re-instantiated when the application is restarted. This can be
achieved by:
::
- drop-caches
- a filesystem unmount and mount cycle
- a system reboot
::
NOTE: Modifications to and the inheritance behavior of FS_XFLAG_DAX remain
the same even when the filesystem is mounted with a dax option. However,
in-core inode state (S_DAX) will be overridden until the filesystem is
remounted with dax=inode and the inode is evicted from kernel memory.
Examples and details
~~~~~~~~~~~~~~~~~~~~
There are 2 per-file dax flags. One is a persistent inode setting
(FS_XFLAG_DAX) and the other is a volatile flag indicating the active
state of the feature (S_DAX).
FS_XFLAG_DAX is preserved within the file system. This persistent config
setting can be set, cleared and/or queried using the
FS_IOC_FS[GS]ETXATTR ioctl (see ioctl_xfs_fsgetxattr(2)) or an utility
such as 'xfs_io'.
New files and directories automatically inherit FS_XFLAG_DAX from their
parent directory \_when\_ \_created\_. Therefore, setting FS_XFLAG_DAX
at directory creation time can be used to set a default behavior for an
entire sub-tree.
To clarify inheritance mount the file system with the inode option.
::
$ mount /dev/pmem0p2 /mnt/xfs-pmem0
Is equivalent to:
::
$ mount -o dax=inode /dev/pmem0p2 /mnt/xfs-pmem0
And here are 3 examples showing how to enable dax on individual files
and/or directories.
Inheritance Example A:
^^^^^^^^^^^^^^^^^^^^^^
::
$ mkdir -p a/b/c
$ xfs_io -c 'chattr +x' a
$ xfs_io -c 'lsattr' a
--------------x- a
$ mkdir -p a/b/c/d
$ mkdir -p a/e
::
Results in:
dax: a,e
no dax: b,c,d
Inheritance Example B:
^^^^^^^^^^^^^^^^^^^^^^
::
$ mkdir a
$ xfs_io -c 'chattr +x' a
$ xfs_io -c 'lsattr' a
--------------x- a
$ mkdir -p a/b/c/d
::
Results in:
dax: a,b,c,d
no dax:
Inheritance Example C:
^^^^^^^^^^^^^^^^^^^^^^
::
$ mkdir -p a/b/c
$ xfs_io -c 'chattr +x' c
$ xfs_io -c 'lsattr' c
--------------x- c
$ mkdir -p a/b/c/d
::
Results in:
dax: c,d
no dax: a,b
Detecting if a file is using dax
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The current enabled state (S_DAX) is set when a file inode is
instantiated in memory by the kernel. It is set based on the underlying
media support, the value of FS_XFLAG_DAX and the file system's dax mount
option.
statx can be used to query S_DAX. NOTE that only regular files will ever
have S_DAX set and therefore statx will never indicate that S_DAX is set
on directories.
Continuing with Example C above we create a file foo in a dax enabled
directory and it is enabled for dax with the FS_XFLAG_DAX set as well as
S_DAX being set.
::
$ touch a/b/c/foo
$ xfs_io -c 'lsattr' a/b/c/foo # FS_XFLAG_DAX == true
--------------x- a/b/c/foo
$ xfs_io -c 'statx -r' a/b/c/foo | grep attributes # S_DAX == true
stat.attributes = 0x2000
Setting the FS_XFLAG_DAX flag (specifically or through inheritance)
occurs even if the underlying media does not support dax and/or the
filesystem is overridden with a mount option.