€•®ÕŒsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ#/translations/zh_CN/filesystems/dax”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/zh_TW/filesystems/dax”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/it_IT/filesystems/dax”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/ja_JP/filesystems/dax”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/ko_KR/filesystems/dax”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/pt_BR/filesystems/dax”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/sp_SP/filesystems/dax”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒDirect Access for files”h]”hŒDirect Access for files”…”�”}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³Œ=/var/lib/git/docbuild/linux/Documentation/filesystems/dax.rst”h´Kubh¶)�”}”(hhh]”(h»)�”}”(hŒ Motivation”h]”hŒ Motivation”…”�”}”(hhÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhhËh²hh³hÊh´KubhŒ paragraph”“”)�”}”(hŒ›The page cache is usually used to buffer reads and writes to files. It is also used to provide the pages which are mapped into userspace by a call to mmap.”h]”hŒ›The page cache is usually used to buffer reads and writes to files. It is also used to provide the pages which are mapped into userspace by a call to mmap.”…”�”}”(hhÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KhhËh²hubhÝ)�”}”(hX For block devices that are memory-like, the page cache pages would be unnecessary copies of the original storage. The `DAX` code removes the extra copy by performing reads and writes directly to the storage device. For file mappings, the storage device is mapped directly into userspace.”h]”(hŒwFor block devices that are memory-like, the page cache pages would be unnecessary copies of the original storage. The ”…”�”}”(hhìh²hh³Nh´NubhŒtitle_reference”“”)�”}”(hŒ`DAX`”h]”hŒDAX”…”�”}”(hhöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhhìubhŒ¤ code removes the extra copy by performing reads and writes directly to the storage device. For file mappings, the storage device is mapped directly into userspace.”…”�”}”(hhìh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K hhËh²hubeh}”(h]”Œ motivation”ah ]”h"]”Œ motivation”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)�”}”(hhh]”(h»)�”}”(hŒUsage”h]”hŒUsage”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´KubhÝ)�”}”(hXIf you have a block device which supports `DAX`, you can make a filesystem on it as usual. The `DAX` code currently only supports files with a block size equal to your kernel's `PAGE_SIZE`, so you may need to specify a block size when creating the filesystem.”h]”(hŒ*If you have a block device which supports ”…”�”}”(hj'h²hh³Nh´Nubhõ)�”}”(hŒ`DAX`”h]”hŒDAX”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj'ubhŒ1, you can make a filesystem on it as usual. The ”…”�”}”(hj'h²hh³Nh´Nubhõ)�”}”(hŒ`DAX`”h]”hŒDAX”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj'ubhŒO code currently only supports files with a block size equal to your kernel’s ”…”�”}”(hj'h²hh³Nh´Nubhõ)�”}”(hŒ `PAGE_SIZE`”h]”hŒ PAGE_SIZE”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj'ubhŒG, so you may need to specify a block size when creating the filesystem.”…”�”}”(hj'h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Khjh²hubhÝ)�”}”(hŒpCurrently 5 filesystems support `DAX`: ext2, ext4, xfs, virtiofs and erofs. Enabling `DAX` on them is different.”h]”(hŒ Currently 5 filesystems support ”…”�”}”(hjkh²hh³Nh´Nubhõ)�”}”(hŒ`DAX`”h]”hŒDAX”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjkubhŒ0: ext2, ext4, xfs, virtiofs and erofs. Enabling ”…”�”}”(hjkh²hh³Nh´Nubhõ)�”}”(hŒ`DAX`”h]”hŒDAX”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjkubhŒ on them is different.”…”�”}”(hjkh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Khjh²hubeh}”(h]”Œusage”ah ]”h"]”Œusage”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)�”}”(hhh]”(h»)�”}”(hŒEnabling DAX on ext2 and erofs”h]”hŒEnabling DAX on ext2 and erofs”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj¥h²hh³hÊh´KubhÝ)�”}”(hŒõ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.”h]”(hŒ&When mounting the filesystem, use the ”…”�”}”(hj¶h²hh³Nh´NubhŒliteral”“”)�”}”(hŒ ``-o dax``”h]”hŒ-o dax”…”�”}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj¶ubhŒ? option on the command line or add ‘dax’ to the options in ”…”�”}”(hj¶h²hh³Nh´Nubj¿)�”}”(hŒ``/etc/fstab``”h]”hŒ /etc/fstab”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj¶ubhŒ. This works to enable ”…”�”}”(hj¶h²hh³Nh´Nubhõ)�”}”(hŒ`DAX`”h]”hŒDAX”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj¶ubhŒ> on all files within the filesystem. It is equivalent to the ”…”�”}”(hj¶h²hh³Nh´Nubj¿)�”}”(hŒ``-o dax=always``”h]”hŒ -o dax=always”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj¶ubhŒ behavior below.”…”�”}”(hj¶h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K hj¥h²hubeh}”(h]”Œenabling-dax-on-ext2-and-erofs”ah ]”h"]”Œenabling dax on ext2 and erofs”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)�”}”(hhh]”h»)�”}”(hŒEnabling DAX on xfs and ext4”h]”hŒEnabling DAX on xfs and ext4”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´K&ubah}”(h]”Œenabling-dax-on-xfs-and-ext4”ah ]”h"]”Œenabling dax on xfs and ext4”ah$]”h&]”uh1hµhh·h²hh³hÊh´K&ubh¶)�”}”(hhh]”(h»)�”}”(hŒSummary”h]”hŒSummary”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj/h²hh³hÊh´K)ubhŒ block_quote”“”)�”}”(hXÛ1. 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. 2. 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. 3. 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. 4. 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``. .. warning:: The option ``-o dax`` may be removed in the future so ``-o dax=always`` is the preferred method for specifying this behavior. .. 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. 5. The `S_DAX` policy can be changed via: a) Setting the parent directory `FS_XFLAG_DAX` as needed before files are created b) Setting the appropriate dax="foo" mount option c) Changing the `FS_XFLAG_DAX` flag on existing regular files and directories. This has runtime constraints and limitations that are described in 6) below. 6. When changing the `S_DAX` policy via toggling the persistent `FS_XFLAG_DAX` flag, the change to existing regular files won't take effect until the files are closed by all processes. ”h]”hŒenumerated_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒ¯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. ”h]”hÝ)�”}”(hŒ®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.”h]”(hŒ0There exists an in-kernel file access mode flag ”…”�”}”(hjQh²hh³Nh´Nubhõ)�”}”(hŒ`S_DAX`”h]”hŒS_DAX”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjQubhŒ$ that corresponds to the statx flag ”…”�”}”(hjQh²hh³Nh´Nubhõ)�”}”(hŒ`STATX_ATTR_DAX`”h]”hŒSTATX_ATTR_DAX”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjQubhŒC. See the manpage for statx(2) for details about this access mode.”…”�”}”(hjQh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K+hjMubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhjHubjL)�”}”(hŒÖ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. ”h]”hÝ)�”}”(hŒÕ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.”h]”(hŒThere exists a persistent flag ”…”�”}”(hj�h²hh³Nh´Nubhõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj�ubhŒš 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 ”…”�”}”(hj�h²hh³Nh´Nubhõ)�”}”(hŒ`S_DAX`”h]”hŒS_DAX”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj�ubhŒ state.”…”�”}”(hj�h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K/hj‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhjHubjL)�”}”(hXUIf 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. ”h]”hÝ)�”}”(hXTIf 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.”h]”(hŒIf the persistent ”…”�”}”(hjÉh²hh³Nh´Nubhõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjÉubhX4 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.”…”�”}”(hjÉh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K3hjÅubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhjHubjL)�”}”(hX…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``. .. warning:: The option ``-o dax`` may be removed in the future so ``-o dax=always`` is the preferred method for specifying this behavior. .. 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. ”h]”(hÝ)�”}”(hŒ¦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:”h]”(hŒ1There exist dax mount options which can override ”…”�”}”(hjóh²hh³Nh´Nubhõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjóubhŒ in the setting of the ”…”�”}”(hjóh²hh³Nh´Nubhõ)�”}”(hŒ`S_DAX`”h]”hŒS_DAX”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjóubhŒ0 flag. Given underlying storage which supports ”…”�”}”(hjóh²hh³Nh´Nubhõ)�”}”(hŒ`DAX`”h]”hŒDAX”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjóubhŒ the following hold:”…”�”}”(hjóh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K9hjïubhÝ)�”}”(hŒC``-o dax=inode`` means "follow `FS_XFLAG_DAX`" and is the default.”h]”(j¿)�”}”(hŒ``-o dax=inode``”h]”hŒ -o dax=inode”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj7ubhŒ means “follow ”…”�”}”(hj7h²hh³Nh´Nubhõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj7ubhŒâ€� and is the default.”…”�”}”(hj7h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K=hjïubhÝ)�”}”(hŒC``-o dax=never`` means "never set `S_DAX`, ignore `FS_XFLAG_DAX`."”h]”(j¿)�”}”(hŒ``-o dax=never``”h]”hŒ -o dax=never”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjeubhŒ means “never set ”…”�”}”(hjeh²hh³Nh´Nubhõ)�”}”(hŒ`S_DAX`”h]”hŒS_DAX”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjeubhŒ , ignore ”…”�”}”(hjeh²hh³Nh´Nubhõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjeubhŒ.â€�”…”�”}”(hjeh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K?hjïubhÝ)�”}”(hŒC``-o dax=always`` means "always set `S_DAX` ignore `FS_XFLAG_DAX`."”h]”(j¿)�”}”(hŒ``-o dax=always``”h]”hŒ -o dax=always”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj¥ubhŒ means “always set ”…”�”}”(hj¥h²hh³Nh´Nubhõ)�”}”(hŒ`S_DAX`”h]”hŒS_DAX”…”�”}”(hj»h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj¥ubhŒ ignore ”…”�”}”(hj¥h²hh³Nh´Nubhõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj¥ubhŒ.â€�”…”�”}”(hj¥h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KAhjïubhÝ)�”}”(hŒH``-o dax`` is a legacy option which is an alias for ``dax=always``.”h]”(j¿)�”}”(hŒ ``-o dax``”h]”hŒ-o dax”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjåubhŒ/ is a legacy option which is an alias for ”…”�”}”(hjåh²hh³Nh´Nubj¿)�”}”(hŒ``dax=always``”h]”hŒ dax=always”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjåubhŒ.”…”�”}”(hjåh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KChjïubhŒwarning”“”)�”}”(hŒ}The option ``-o dax`` may be removed in the future so ``-o dax=always`` is the preferred method for specifying this behavior.”h]”hÝ)�”}”(hŒ}The option ``-o dax`` may be removed in the future so ``-o dax=always`` is the preferred method for specifying this behavior.”h]”(hŒ The option ”…”�”}”(hjh²hh³Nh´Nubj¿)�”}”(hŒ ``-o dax``”h]”hŒ-o dax”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjubhŒ! may be removed in the future so ”…”�”}”(hjh²hh³Nh´Nubj¿)�”}”(hŒ``-o dax=always``”h]”hŒ -o dax=always”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjubhŒ6 is the preferred method for specifying this behavior.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KGhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjïubhŒnote”“”)�”}”(hXModifications 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.”h]”hÝ)�”}”(hXModifications 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.”h]”(hŒ1Modifications to and the inheritance behavior of ”…”�”}”(hjWh²hh³Nh´Nubhõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjWubhŒg remain the same even when the filesystem is mounted with a dax option. However, in-core inode state (”…”�”}”(hjWh²hh³Nh´Nubhõ)�”}”(hŒ`S_DAX`”h]”hŒS_DAX”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjWubhŒr) will be overridden until the filesystem is remounted with dax=inode and the inode is evicted from kernel memory.”…”�”}”(hjWh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KLhjSubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjïubeh}”(h]”h ]”h"]”h$]”h&]”uh1jKhjHubjL)�”}”(hXTThe `S_DAX` policy can be changed via: a) Setting the parent directory `FS_XFLAG_DAX` as needed before files are created b) Setting the appropriate dax="foo" mount option c) Changing the `FS_XFLAG_DAX` flag on existing regular files and directories. This has runtime constraints and limitations that are described in 6) below. ”h]”(hÝ)�”}”(hŒ&The `S_DAX` policy can be changed via:”h]”(hŒThe ”…”�”}”(hj™h²hh³Nh´Nubhõ)�”}”(hŒ`S_DAX`”h]”hŒS_DAX”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj™ubhŒ policy can be changed via:”…”�”}”(hj™h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KQhj•ubjG)�”}”(hhh]”(jL)�”}”(hŒOSetting the parent directory `FS_XFLAG_DAX` as needed before files are created ”h]”hÝ)�”}”(hŒNSetting the parent directory `FS_XFLAG_DAX` as needed before files are created”h]”(hŒSetting the parent directory ”…”�”}”(hjÀh²hh³Nh´Nubhõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjÀubhŒ# as needed before files are created”…”�”}”(hjÀh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KShj¼ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhj¹ubjL)�”}”(hŒ/Setting the appropriate dax="foo" mount option ”h]”hÝ)�”}”(hŒ.Setting the appropriate dax="foo" mount option”h]”hŒ2Setting the appropriate dax=â€�fooâ€� mount option”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KVhjæubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhj¹ubjL)�”}”(hŒšChanging the `FS_XFLAG_DAX` flag on existing regular files and directories. This has runtime constraints and limitations that are described in 6) below. ”h]”hÝ)�”}”(hŒ™Changing the `FS_XFLAG_DAX` flag on existing regular files and directories. This has runtime constraints and limitations that are described in 6) below.”h]”(hŒ Changing the ”…”�”}”(hjh²hh³Nh´Nubhõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjubhŒ~ flag on existing regular files and directories. This has runtime constraints and limitations that are described in 6) below.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KXhjþubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhj¹ubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œ loweralpha”Œprefix”hŒsuffix”Œ)”uh1jFhj•ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jKhjHubjL)�”}”(hŒ·When changing the `S_DAX` policy via toggling the persistent `FS_XFLAG_DAX` flag, the change to existing regular files won't take effect until the files are closed by all processes. ”h]”hÝ)�”}”(hŒµWhen changing the `S_DAX` policy via toggling the persistent `FS_XFLAG_DAX` flag, the change to existing regular files won't take effect until the files are closed by all processes.”h]”(hŒWhen changing the ”…”�”}”(hj=h²hh³Nh´Nubhõ)�”}”(hŒ`S_DAX`”h]”hŒS_DAX”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj=ubhŒ$ policy via toggling the persistent ”…”�”}”(hj=h²hh³Nh´Nubhõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj=ubhŒl flag, the change to existing regular files won’t take effect until the files are closed by all processes.”…”�”}”(hj=h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K\hj9ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhjHubeh}”(h]”h ]”h"]”h$]”h&]”j.Œarabic”j0hj1Œ.”uh1jFhjBubah}”(h]”h ]”h"]”h$]”h&]”uh1j@h³hÊh´K+hj/h²hubeh}”(h]”Œsummary”ah ]”h"]”Œsummary”ah$]”h&]”uh1hµhh·h²hh³hÊh´K)ubh¶)�”}”(hhh]”(h»)�”}”(hŒDetails”h]”hŒDetails”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj‹h²hh³hÊh´KbubhÝ)�”}”(hŒª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`).”h]”(hŒDThere are 2 per-file dax flags. One is a persistent inode setting (”…”�”}”(hjœh²hh³Nh´Nubhõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjœubhŒO) and the other is a volatile flag indicating the active state of the feature (”…”�”}”(hjœh²hh³Nh´Nubhõ)�”}”(hŒ`S_DAX`”h]”hŒS_DAX”…”�”}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjœubhŒ).”…”�”}”(hjœh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kdhj‹h²hubhÝ)�”}”(hŒÞ`FS_XFLAG_DAX` is preserved within the filesystem. 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'.”h]”(hõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjÎubhŒr is preserved within the filesystem. This persistent config setting can be set, cleared and/or queried using the ”…”�”}”(hjÎh²hh³Nh´Nubhõ)�”}”(hŒ`FS_IOC_FS`[`GS`”h]”hŒFS_IOC_FS`[`GS”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjÎubhŒR]`ETXATTR` ioctl (see ioctl_xfs_fsgetxattr(2)) or an utility such as ‘xfs_io’.”…”�”}”(hjÎh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Khhj‹h²hubhÝ)�”}”(hŒè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.”h]”(hŒ0New files and directories automatically inherit ”…”�”}”(hjüh²hh³Nh´Nubhõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjüubhŒ from their parent directory ”…”�”}”(hjüh²hh³Nh´NubhŒstrong”“”)�”}”(hŒ**when created**”h]”hŒ when created”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjüubhŒ. Therefore, setting ”…”�”}”(hjüh²hh³Nh´Nubhõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjüubhŒY at directory creation time can be used to set a default behavior for an entire sub-tree.”…”�”}”(hjüh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Klhj‹h²hubhÝ)�”}”(hŒ,To clarify inheritance, here are 3 examples:”h]”hŒ,To clarify inheritance, here are 3 examples:”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kqhj‹h²hubhÝ)�”}”(hŒ Example A:”h]”hŒ Example A:”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kshj‹h²hubhŒ literal_block”“”)�”}”(hŒmmkdir -p a/b/c xfs_io -c 'chattr +x' a mkdir a/b/c/d mkdir a/e ------[outcome]------ dax: a,e no dax: b,c,d”h]”hŒmmkdir -p a/b/c xfs_io -c 'chattr +x' a mkdir a/b/c/d mkdir a/e ------[outcome]------ dax: a,e no dax: b,c,d”…”�”}”hj`sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”Œforce”‰Œlanguage”Œshell”Œhighlight_args”}”uh1j^h³hÊh´Kuhj‹h²hubhÝ)�”}”(hŒ Example B:”h]”hŒ Example B:”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K�hj‹h²hubj_)�”}”(hŒ]mkdir a xfs_io -c 'chattr +x' a mkdir -p a/b/c/d ------[outcome]------ dax: a,b,c,d no dax:”h]”hŒ]mkdir a xfs_io -c 'chattr +x' a mkdir -p a/b/c/d ------[outcome]------ dax: a,b,c,d no dax:”…”�”}”hjƒsbah}”(h]”h ]”h"]”h$]”h&]”jnjojp‰jqŒshell”js}”uh1j^h³hÊh´Kƒhj‹h²hubhÝ)�”}”(hŒ Example C:”h]”hŒ Example C:”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KŽhj‹h²hubj_)�”}”(hŒamkdir -p a/b/c xfs_io -c 'chattr +x' c mkdir a/b/c/d ------[outcome]------ dax: c,d no dax: a,b”h]”hŒamkdir -p a/b/c xfs_io -c 'chattr +x' c mkdir a/b/c/d ------[outcome]------ dax: c,d no dax: a,b”…”�”}”hj¡sbah}”(h]”h ]”h"]”h$]”h&]”jnjojp‰jqŒshell”js}”uh1j^h³hÊh´K�hj‹h²hubhÝ)�”}”(hŒÚ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 filesystem's dax mount option.”h]”(hŒThe current enabled state (”…”�”}”(hj±h²hh³Nh´Nubhõ)�”}”(hŒ`S_DAX`”h]”hŒS_DAX”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj±ubhŒƒ) 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 ”…”�”}”(hj±h²hh³Nh´Nubhõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj±ubhŒ) and the filesystem’s dax mount option.”…”�”}”(hj±h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K›hj‹h²hubhÝ)�”}”(hŒ#statx can be used to query `S_DAX`.”h]”(hŒstatx can be used to query ”…”�”}”(hjãh²hh³Nh´Nubhõ)�”}”(hŒ`S_DAX`”h]”hŒS_DAX”…”�”}”(hjëh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjãubhŒ.”…”�”}”(hjãh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KŸhj‹h²hubjR)�”}”(hŒ~That only regular files will ever have `S_DAX` set and therefore statx will never indicate that `S_DAX` is set on directories.”h]”hÝ)�”}”(hŒ~That only regular files will ever have `S_DAX` set and therefore statx will never indicate that `S_DAX` is set on directories.”h]”(hŒ'That only regular files will ever have ”…”�”}”(hjh²hh³Nh´Nubhõ)�”}”(hŒ`S_DAX`”h]”hŒS_DAX”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjubhŒ2 set and therefore statx will never indicate that ”…”�”}”(hjh²hh³Nh´Nubhõ)�”}”(hŒ`S_DAX`”h]”hŒS_DAX”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjubhŒ is set on directories.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K£hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj‹h²hh³hÊh´NubhÝ)�”}”(hŒ·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.”h]”(hŒ Setting the ”…”�”}”(hj?h²hh³Nh´Nubhõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj?ubhŒ� 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.”…”�”}”(hj?h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K¦hj‹h²hubeh}”(h]”Œdetails”ah ]”h"]”Œdetails”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kbubh¶)�”}”(hhh]”(h»)�”}”(hŒEnabling DAX on virtiofs”h]”hŒEnabling DAX on virtiofs”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjgh²hh³hÊh´K¬ubhÝ)�”}”(hXThe semantic of DAX on virtiofs is basically equal to that on ext4 and xfs, except that when '-o dax=inode' is specified, virtiofs client derives the hint whether DAX shall be enabled or not from virtiofs server through FUSE protocol, rather than the persistent `FS_XFLAG_DAX` flag. That is, whether DAX shall be enabled or not is completely determined by virtiofs server, while virtiofs server itself may deploy various algorithm making this decision, e.g. depending on the persistent `FS_XFLAG_DAX` flag on the host.”h]”(hX The semantic of DAX on virtiofs is basically equal to that on ext4 and xfs, except that when ‘-o dax=inode’ is specified, virtiofs client derives the hint whether DAX shall be enabled or not from virtiofs server through FUSE protocol, rather than the persistent ”…”�”}”(hjxh²hh³Nh´Nubhõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjxubhŒÒ flag. That is, whether DAX shall be enabled or not is completely determined by virtiofs server, while virtiofs server itself may deploy various algorithm making this decision, e.g. depending on the persistent ”…”�”}”(hjxh²hh³Nh´Nubhõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjxubhŒ flag on the host.”…”�”}”(hjxh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K­hjgh²hubhÝ)�”}”(hX.It is still supported to set or clear persistent `FS_XFLAG_DAX` flag inside guest, but it is not guaranteed that DAX will be enabled or disabled for corresponding file then. Users inside guest still need to call statx(2) and check the statx flag `STATX_ATTR_DAX` to see if DAX is enabled for this file.”h]”(hŒ1It is still supported to set or clear persistent ”…”�”}”(hjªh²hh³Nh´Nubhõ)�”}”(hŒ`FS_XFLAG_DAX`”h]”hŒ FS_XFLAG_DAX”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjªubhŒ· flag inside guest, but it is not guaranteed that DAX will be enabled or disabled for corresponding file then. Users inside guest still need to call statx(2) and check the statx flag ”…”�”}”(hjªh²hh³Nh´Nubhõ)�”}”(hŒ`STATX_ATTR_DAX`”h]”hŒSTATX_ATTR_DAX”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjªubhŒ( to see if DAX is enabled for this file.”…”�”}”(hjªh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kµhjgh²hubeh}”(h]”Œenabling-dax-on-virtiofs”ah ]”h"]”Œenabling dax on virtiofs”ah$]”h&]”uh1hµhh·h²hh³hÊh´K¬ubh¶)�”}”(hhh]”(h»)�”}”(hŒ,Implementation Tips for Block Driver Writers”h]”hŒ,Implementation Tips for Block Driver Writers”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjäh²hh³hÊh´K¼ubhÝ)�”}”(hXPTo support `DAX` in your block driver, implement the 'direct_access' block device operation. It is used to translate the sector number (expressed in units of 512-byte sectors) to a page frame number (pfn) that identifies the physical page for the memory. It also returns a kernel virtual address that can be used to access the memory.”h]”(hŒ To support ”…”�”}”(hjõh²hh³Nh´Nubhõ)�”}”(hŒ`DAX`”h]”hŒDAX”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjõubhXD in your block driver, implement the ‘direct_access’ block device operation. It is used to translate the sector number (expressed in units of 512-byte sectors) to a page frame number (pfn) that identifies the physical page for the memory. It also returns a kernel virtual address that can be used to access the memory.”…”�”}”(hjõh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K¾hjäh²hubhÝ)�”}”(hXThe direct_access method takes a 'size' parameter that indicates the number of bytes being requested. The function should return the number of bytes that can be contiguously accessed at that offset. It may also return a negative errno if an error occurs.”h]”hXThe direct_access method takes a ‘size’ parameter that indicates the number of bytes being requested. The function should return the number of bytes that can be contiguously accessed at that offset. It may also return a negative errno if an error occurs.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÄhjäh²hubhÝ)�”}”(hXrIn order to support this method, the storage must be byte-accessible by the CPU at all times. If your device uses paging techniques to expose a large amount of memory through a smaller window, then you cannot implement direct_access. Equally, if your device can occasionally stall the CPU for an extended period, you should also not attempt to implement direct_access.”h]”hXrIn order to support this method, the storage must be byte-accessible by the CPU at all times. If your device uses paging techniques to expose a large amount of memory through a smaller window, then you cannot implement direct_access. Equally, if your device can occasionally stall the CPU for an extended period, you should also not attempt to implement direct_access.”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÉhjäh²hubhÝ)�”}”(hŒXThese block devices may be used for inspiration: - pmem: NVDIMM persistent memory driver”h]”hŒXThese block devices may be used for inspiration: - pmem: NVDIMM persistent memory driver”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÐhjäh²hubeh}”(h]”Œ,implementation-tips-for-block-driver-writers”ah ]”h"]”Œ,implementation tips for block driver writers”ah$]”h&]”uh1hµhh·h²hh³hÊh´K¼ubh¶)�”}”(hhh]”(h»)�”}”(hŒ*Implementation Tips for Filesystem Writers”h]”hŒ*Implementation Tips for Filesystem Writers”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjGh²hh³hÊh´KÕubhÝ)�”}”(hŒFilesystem support consists of:”h]”hŒFilesystem support consists of:”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K×hjGh²hubhŒ bullet_list”“”)�”}”(hhh]”(jL)�”}”(hŒSAdding support to mark inodes as being `DAX` by setting the `S_DAX` flag in i_flags”h]”hÝ)�”}”(hŒSAdding support to mark inodes as being `DAX` by setting the `S_DAX` flag in i_flags”h]”(hŒ'Adding support to mark inodes as being ”…”�”}”(hjoh²hh³Nh´Nubhõ)�”}”(hŒ`DAX`”h]”hŒDAX”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjoubhŒ by setting the ”…”�”}”(hjoh²hh³Nh´Nubhõ)�”}”(hŒ`S_DAX`”h]”hŒS_DAX”…”�”}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjoubhŒ flag in i_flags”…”�”}”(hjoh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÙhjkubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhjhh²hh³hÊh´NubjL)�”}”(hŒwImplementing ->read_iter and ->write_iter operations which use :c:func:`dax_iomap_rw()` when inode has `S_DAX` flag set”h]”hÝ)�”}”(hŒwImplementing ->read_iter and ->write_iter operations which use :c:func:`dax_iomap_rw()` when inode has `S_DAX` flag set”h]”(hŒ?Implementing ->read_iter and ->write_iter operations which use ”…”�”}”(hj«h²hh³Nh´Nubh)�”}”(hŒ:c:func:`dax_iomap_rw()`”h]”j¿)�”}”(hjµh]”hŒdax_iomap_rw()”…”�”}”(hj·h²hh³Nh´Nubah}”(h]”h ]”(Œxref”Œc”Œc-func”eh"]”h$]”h&]”uh1j¾hj³ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œfilesystems/dax”Œ refdomain”jÂŒreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰Œ reftarget”Œ dax_iomap_rw”uh1hh³hÊh´KÛhj«ubhŒ when inode has ”…”�”}”(hj«h²hh³Nh´Nubhõ)�”}”(hŒ`S_DAX`”h]”hŒS_DAX”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj«ubhŒ flag set”…”�”}”(hj«h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÛhj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhjhh²hh³hÊh´NubjL)�”}”(hXKImplementing an mmap file operation for `DAX` files which sets the `VM_MIXEDMAP` and `VM_HUGEPAGE` flags on the `VMA`, and setting the vm_ops to include handlers for fault, pmd_fault, page_mkwrite, pfn_mkwrite. These handlers should probably call :c:func:`dax_iomap_fault()` passing the appropriate fault size and iomap operations.”h]”hÝ)�”}”(hXKImplementing an mmap file operation for `DAX` files which sets the `VM_MIXEDMAP` and `VM_HUGEPAGE` flags on the `VMA`, and setting the vm_ops to include handlers for fault, pmd_fault, page_mkwrite, pfn_mkwrite. These handlers should probably call :c:func:`dax_iomap_fault()` passing the appropriate fault size and iomap operations.”h]”(hŒ(Implementing an mmap file operation for ”…”�”}”(hjüh²hh³Nh´Nubhõ)�”}”(hŒ`DAX`”h]”hŒDAX”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjüubhŒ files which sets the ”…”�”}”(hjüh²hh³Nh´Nubhõ)�”}”(hŒ `VM_MIXEDMAP`”h]”hŒ VM_MIXEDMAP”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjüubhŒ and ”…”�”}”(hjüh²hh³Nh´Nubhõ)�”}”(hŒ `VM_HUGEPAGE`”h]”hŒ VM_HUGEPAGE”…”�”}”(hj( h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjüubhŒ flags on the ”…”�”}”(hjüh²hh³Nh´Nubhõ)�”}”(hŒ`VMA`”h]”hŒVMA”…”�”}”(hj: h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjüubhŒ‚, and setting the vm_ops to include handlers for fault, pmd_fault, page_mkwrite, pfn_mkwrite. These handlers should probably call ”…”�”}”(hjüh²hh³Nh´Nubh)�”}”(hŒ:c:func:`dax_iomap_fault()`”h]”j¿)�”}”(hjN h]”hŒdax_iomap_fault()”…”�”}”(hjP h²hh³Nh´Nubah}”(h]”h ]”(jÁjÂŒc-func”eh"]”h$]”h&]”uh1j¾hjL ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jÎŒ refdomain”jÂŒreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰jÔŒdax_iomap_fault”uh1hh³hÊh´KÝhjüubhŒ9 passing the appropriate fault size and iomap operations.”…”�”}”(hjüh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÝhjøubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhjhh²hh³hÊh´NubjL)�”}”(hŒ„Calling :c:func:`iomap_zero_range()` passing appropriate iomap operations instead of :c:func:`block_truncate_page()` for `DAX` files”h]”hÝ)�”}”(hŒ„Calling :c:func:`iomap_zero_range()` passing appropriate iomap operations instead of :c:func:`block_truncate_page()` for `DAX` files”h]”(hŒCalling ”…”�”}”(hj h²hh³Nh´Nubh)�”}”(hŒ:c:func:`iomap_zero_range()`”h]”j¿)�”}”(hj‰ h]”hŒiomap_zero_range()”…”�”}”(hj‹ h²hh³Nh´Nubah}”(h]”h ]”(jÁjÂŒc-func”eh"]”h$]”h&]”uh1j¾hj‡ ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jÎŒ refdomain”jÂŒreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰jÔŒiomap_zero_range”uh1hh³hÊh´Kâhj ubhŒ1 passing appropriate iomap operations instead of ”…”�”}”(hj h²hh³Nh´Nubh)�”}”(hŒ:c:func:`block_truncate_page()`”h]”j¿)�”}”(hj¬ h]”hŒblock_truncate_page()”…”�”}”(hj® h²hh³Nh´Nubah}”(h]”h ]”(jÁjÂŒc-func”eh"]”h$]”h&]”uh1j¾hjª ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jÎŒ refdomain”jÂŒreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰jÔŒblock_truncate_page”uh1hh³hÊh´Kâhj ubhŒ for ”…”�”}”(hj h²hh³Nh´Nubhõ)�”}”(hŒ`DAX`”h]”hŒDAX”…”�”}”(hjÍ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj ubhŒ files”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kâhj{ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhjhh²hh³hÊh´NubjL)�”}”(hŒ[Ensuring that there is sufficient locking between reads, writes, truncates and page faults ”h]”hÝ)�”}”(hŒZEnsuring that there is sufficient locking between reads, writes, truncates and page faults”h]”hŒZEnsuring that there is sufficient locking between reads, writes, truncates and page faults”…”�”}”(hjï h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kähjë ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhjhh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1jfh³hÊh´KÙhjGh²hubhÝ)�”}”(hŒÉThe iomap handlers for allocating blocks must make sure that allocated blocks are zeroed out and converted to written extents before being returned to avoid exposure of uninitialized data through mmap.”h]”hŒÉThe iomap handlers for allocating blocks must make sure that allocated blocks are zeroed out and converted to written extents before being returned to avoid exposure of uninitialized data through mmap.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KçhjGh²hubhÝ)�”}”(hŒ.These filesystems may be used for inspiration:”h]”hŒ.These filesystems may be used for inspiration:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KëhjGh²hubhŒseealso”“”)�”}”(hŒ,ext2: see Documentation/filesystems/ext2.rst”h]”hÝ)�”}”(hj+ h]”hŒ,ext2: see Documentation/filesystems/ext2.rst”…”�”}”(hj- h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kïhj) ubah}”(h]”h ]”h"]”h$]”h&]”uh1j' hjGh²hh³hÊh´Nubj( )�”}”(hŒ+xfs: see Documentation/admin-guide/xfs.rst”h]”hÝ)�”}”(hjB h]”hŒ+xfs: see Documentation/admin-guide/xfs.rst”…”�”}”(hjD h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kóhj@ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j' hjGh²hh³hÊh´Nubj( )�”}”(hŒ)ext4: see Documentation/filesystems/ext4/”h]”hÝ)�”}”(hjY h]”hŒ)ext4: see Documentation/filesystems/ext4/”…”�”}”(hj[ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K÷hjW ubah}”(h]”h ]”h"]”h$]”h&]”uh1j' hjGh²hh³hÊh´Nubeh}”(h]”Œ*implementation-tips-for-filesystem-writers”ah ]”h"]”Œ*implementation tips for filesystem writers”ah$]”h&]”uh1hµhh·h²hh³hÊh´KÕubh¶)�”}”(hhh]”(h»)�”}”(hŒHandling Media Errors”h]”hŒHandling Media Errors”…”�”}”(hjy h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjv h²hh³hÊh´KûubhÝ)�”}”(hX¶The libnvdimm subsystem stores a record of known media error locations for each pmem block device (in gendisk->badblocks). If we fault at such location, or one with a latent error not yet discovered, the application can expect to receive a `SIGBUS`. Libnvdimm also allows clearing of these errors by simply writing the affected sectors (through the pmem driver, and if the underlying NVDIMM supports the clear_poison DSM defined by ACPI).”h]”(hŒðThe libnvdimm subsystem stores a record of known media error locations for each pmem block device (in gendisk->badblocks). If we fault at such location, or one with a latent error not yet discovered, the application can expect to receive a ”…”�”}”(hj‡ h²hh³Nh´Nubhõ)�”}”(hŒ`SIGBUS`”h]”hŒSIGBUS”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj‡ ubhŒ¾. Libnvdimm also allows clearing of these errors by simply writing the affected sectors (through the pmem driver, and if the underlying NVDIMM supports the clear_poison DSM defined by ACPI).”…”�”}”(hj‡ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kýhjv h²hubhÝ)�”}”(hŒÇSince `DAX` IO normally doesn't go through the ``driver/bio`` path, applications or sysadmins have an option to restore the lost data from a prior ``backup/inbuilt`` redundancy in the following ways:”h]”(hŒSince ”…”�”}”(hj§ h²hh³Nh´Nubhõ)�”}”(hŒ`DAX`”h]”hŒDAX”…”�”}”(hj¯ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj§ ubhŒ& IO normally doesn’t go through the ”…”�”}”(hj§ h²hh³Nh´Nubj¿)�”}”(hŒ``driver/bio``”h]”hŒ driver/bio”…”�”}”(hjÁ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj§ ubhŒV path, applications or sysadmins have an option to restore the lost data from a prior ”…”�”}”(hj§ h²hh³Nh´Nubj¿)�”}”(hŒ``backup/inbuilt``”h]”hŒbackup/inbuilt”…”�”}”(hjÓ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj§ ubhŒ" redundancy in the following ways:”…”�”}”(hj§ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhjv h²hubjG)�”}”(hhh]”(jL)�”}”(hX Delete the affected file, and restore from a backup (sysadmin route): This will free the filesystem blocks that were being used by the file, and the next time they're allocated, they will be zeroed first, which happens through the driver, and will clear bad sectors. ”h]”hÝ)�”}”(hX Delete the affected file, and restore from a backup (sysadmin route): This will free the filesystem blocks that were being used by the file, and the next time they're allocated, they will be zeroed first, which happens through the driver, and will clear bad sectors.”h]”hX Delete the affected file, and restore from a backup (sysadmin route): This will free the filesystem blocks that were being used by the file, and the next time they’re allocated, they will be zeroed first, which happens through the driver, and will clear bad sectors.”…”�”}”(hjò h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhjî ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhjë h²hh³hÊh´NubjL)�”}”(hŒ­Truncate or hole-punch the part of the file that has a bad-block (at least an entire aligned sector has to be hole-punched, but not necessarily an entire filesystem block). ”h]”hÝ)�”}”(hŒ¬Truncate or hole-punch the part of the file that has a bad-block (at least an entire aligned sector has to be hole-punched, but not necessarily an entire filesystem block).”h]”hŒ¬Truncate or hole-punch the part of the file that has a bad-block (at least an entire aligned sector has to be hole-punched, but not necessarily an entire filesystem block).”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhjë h²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j.j{j0hj1j|uh1jFhjv h²hh³hÊh´MubhÝ)�”}”(hXãThese are the two basic paths that allow `DAX` filesystems to continue operating in the presence of media errors. More robust error recovery mechanisms can be built on top of this in the future, for example, involving redundancy/mirroring provided at the block layer through DM, or additionally, at the filesystem level. These would have to rely on the above two tenets, that error clearing can happen either by sending an IO through the driver, or zeroing (also through the driver).”h]”(hŒ)These are the two basic paths that allow ”…”�”}”(hj$ h²hh³Nh´Nubhõ)�”}”(hŒ`DAX`”h]”hŒDAX”…”�”}”(hj, h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj$ ubhXµ filesystems to continue operating in the presence of media errors. More robust error recovery mechanisms can be built on top of this in the future, for example, involving redundancy/mirroring provided at the block layer through DM, or additionally, at the filesystem level. These would have to rely on the above two tenets, that error clearing can happen either by sending an IO through the driver, or zeroing (also through the driver).”…”�”}”(hj$ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhjv h²hubeh}”(h]”Œhandling-media-errors”ah ]”h"]”Œhandling media errors”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kûubh¶)�”}”(hhh]”(h»)�”}”(hŒ Shortcomings”h]”hŒ Shortcomings”…”�”}”(hjO h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjL h²hh³hÊh´MubhÝ)�”}”(hŒ›Even if the kernel or its modules are stored on a filesystem that supports `DAX` on a block device that supports `DAX`, they will still be copied into RAM.”h]”(hŒKEven if the kernel or its modules are stored on a filesystem that supports ”…”�”}”(hj] h²hh³Nh´Nubhõ)�”}”(hŒ`DAX`”h]”hŒDAX”…”�”}”(hje h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj] ubhŒ! on a block device that supports ”…”�”}”(hj] h²hh³Nh´Nubhõ)�”}”(hŒ`DAX`”h]”hŒDAX”…”�”}”(hjw h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj] ubhŒ%, they will still be copied into RAM.”…”�”}”(hj] h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MhjL h²hubhÝ)�”}”(hŒuThe DAX code does not work correctly on architectures which have virtually mapped caches such as ARM, MIPS and SPARC.”h]”hŒuThe DAX code does not work correctly on architectures which have virtually mapped caches such as ARM, MIPS and SPARC.”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M hjL h²hubhÝ)�”}”(hXîCalling :c:func:`get_user_pages()` on a range of user memory that has been mmapped from a `DAX` file will fail when there are no 'struct page' to describe those pages. This problem has been addressed in some device drivers by adding optional struct page support for pages under the control of the driver (see `CONFIG_NVDIMM_PFN` in ``drivers/nvdimm`` for an example of how to do this). In the non struct page cases `O_DIRECT` reads/writes to those memory ranges from a non-`DAX` file will fail”h]”(hŒCalling ”…”�”}”(hj� h²hh³Nh´Nubh)�”}”(hŒ:c:func:`get_user_pages()`”h]”j¿)�”}”(hj§ h]”hŒget_user_pages()”…”�”}”(hj© h²hh³Nh´Nubah}”(h]”h ]”(jÁjÂŒc-func”eh"]”h$]”h&]”uh1j¾hj¥ ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jÎŒ refdomain”jÂŒreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰jÔŒget_user_pages”uh1hh³hÊh´M#hj� ubhŒ8 on a range of user memory that has been mmapped from a ”…”�”}”(hj� h²hh³Nh´Nubhõ)�”}”(hŒ`DAX`”h]”hŒDAX”…”�”}”(hjÈ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj� ubhŒÛ file will fail when there are no ‘struct page’ to describe those pages. This problem has been addressed in some device drivers by adding optional struct page support for pages under the control of the driver (see ”…”�”}”(hj� h²hh³Nh´Nubhõ)�”}”(hŒ`CONFIG_NVDIMM_PFN`”h]”hŒCONFIG_NVDIMM_PFN”…”�”}”(hjÚ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj� ubhŒ in ”…”�”}”(hj� h²hh³Nh´Nubj¿)�”}”(hŒ``drivers/nvdimm``”h]”hŒdrivers/nvdimm”…”�”}”(hjì h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj� ubhŒA for an example of how to do this). In the non struct page cases ”…”�”}”(hj� h²hh³Nh´Nubhõ)�”}”(hŒ `O_DIRECT`”h]”hŒO_DIRECT”…”�”}”(hjþ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj� ubhŒ0 reads/writes to those memory ranges from a non-”…”�”}”(hj� h²hh³Nh´Nubhõ)�”}”(hŒ`DAX`”h]”hŒDAX”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj� ubhŒ file will fail”…”�”}”(hj� h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M#hjL h²hubjR)�”}”(hŒä`O_DIRECT` reads/writes _of a `DAX` file do work, it is the memory that is being accessed that is key here). Other things that will not work in the non struct page case include RDMA, :c:func:`sendfile()` and :c:func:`splice()`.”h]”hÝ)�”}”(hŒä`O_DIRECT` reads/writes _of a `DAX` file do work, it is the memory that is being accessed that is key here). Other things that will not work in the non struct page case include RDMA, :c:func:`sendfile()` and :c:func:`splice()`.”h]”(hõ)�”}”(hŒ `O_DIRECT`”h]”hŒO_DIRECT”…”�”}”(hj0 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj, ubhŒ reads/writes _of a ”…”�”}”(hj, h²hh³Nh´Nubhõ)�”}”(hŒ`DAX`”h]”hŒDAX”…”�”}”(hjB h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj, ubhŒ• file do work, it is the memory that is being accessed that is key here). Other things that will not work in the non struct page case include RDMA, ”…”�”}”(hj, h²hh³Nh´Nubh)�”}”(hŒ:c:func:`sendfile()`”h]”j¿)�”}”(hjV h]”hŒ sendfile()”…”�”}”(hjX h²hh³Nh´Nubah}”(h]”h ]”(jÁjÂŒc-func”eh"]”h$]”h&]”uh1j¾hjT ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jÎŒ refdomain”jÂŒreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰jÔŒsendfile”uh1hh³hÊh´M.hj, ubhŒ and ”…”�”}”(hj, h²hh³Nh´Nubh)�”}”(hŒ:c:func:`splice()`”h]”j¿)�”}”(hjy h]”hŒsplice()”…”�”}”(hj{ h²hh³Nh´Nubah}”(h]”h ]”(jÁjÂŒc-func”eh"]”h$]”h&]”uh1j¾hjw ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jÎŒ refdomain”jÂŒreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰jÔŒsplice”uh1hh³hÊh´M.hj, ubhŒ.”…”�”}”(hj, h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M.hj( ubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjL h²hh³hÊh´Nubeh}”(h]”Œ shortcomings”ah ]”h"]”Œ shortcomings”ah$]”h&]”uh1hµhh·h²hh³hÊh´Mubeh}”(h]”Œdirect-access-for-files”ah ]”h"]”Œdirect access for files”ah$]”h&]”uh1hµhhh²hh³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÊuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hºNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jÙ Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÊŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j³ j° jjj¢jŸjjj,j)jˆj…jdjajájÞjDjAjs jp jI jF j« j¨ uŒ nametypes”}”(j³ ‰j‰j¢‰j‰j,‰jˆ‰jd‰já‰jD‰js ‰jI ‰j« ‰uh}”(j° h·jhËjŸjjj¥j)jj…j/jaj‹jÞjgjAjäjp jGjF jv j¨ jL uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.