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
As of kernel 5.8 additional DAX enabling options are available on some file systems, specifically:
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.
As of kernel 5.8 ext4 and xfs supports the new per-file dax configuration.
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.
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.
$ 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
$ 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:
$ 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
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.