sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget,/translations/zh_CN/filesystems/ext4/dynamicmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/zh_TW/filesystems/ext4/dynamicmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/it_IT/filesystems/ext4/dynamicmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/ja_JP/filesystems/ext4/dynamicmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/ko_KR/filesystems/ext4/dynamicmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/sp_SP/filesystems/ext4/dynamicmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhF/var/lib/git/docbuild/linux/Documentation/filesystems/ext4/dynamic.rsthKubhsection)}(hhh](htitle)}(hDynamic Structuresh]hDynamic Structures}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hUDynamic metadata are created on the fly when files and blocks are allocated to files.h]hUDynamic metadata are created on the fly when files and blocks are allocated to files.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&]hhuh1hhhhhh)Documentation/filesystems/ext4/inodes.rsthKubh)}(hhh](h)}(h Index Nodesh]h Index Nodes}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hXIn a regular UNIX filesystem, the inode stores all the metadata pertaining to the file (time stamps, block maps, extended attributes, etc), not the directory entry. To find the information associated with a file, one must traverse the directory files to find the directory entry associated with a file, then load the inode to find the metadata for that file. ext4 appears to cheat (for performance reasons) a little bit by storing a copy of the file type (normally stored in the inode) in the directory entry. (Compare all this to FAT, which stores all the file information directly in the directory entry, but does not support hard links and is in general more seek-happy than ext4 due to its simpler block allocator and extensive use of linked lists.)h]hXIn a regular UNIX filesystem, the inode stores all the metadata pertaining to the file (time stamps, block maps, extended attributes, etc), not the directory entry. To find the information associated with a file, one must traverse the directory files to find the directory entry associated with a file, then load the inode to find the metadata for that file. ext4 appears to cheat (for performance reasons) a little bit by storing a copy of the file type (normally stored in the inode) in the directory entry. (Compare all this to FAT, which stores all the file information directly in the directory entry, but does not support hard links and is in general more seek-happy than ext4 due to its simpler block allocator and extensive use of linked lists.)}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXThe inode table is a linear array of ``struct ext4_inode``. The table is sized to have enough blocks to store at least ``sb.s_inode_size * sb.s_inodes_per_group`` bytes. The number of the block group containing an inode can be calculated as ``(inode_number - 1) / sb.s_inodes_per_group``, and the offset into the group's table is ``(inode_number - 1) % sb.s_inodes_per_group``. There is no inode 0.h](h%The inode table is a linear array of }(hjhhhNhNubhliteral)}(h``struct ext4_inode``h]hstruct ext4_inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh=. The table is sized to have enough blocks to store at least }(hjhhhNhNubj)}(h+``sb.s_inode_size * sb.s_inodes_per_group``h]h'sb.s_inode_size * sb.s_inodes_per_group}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhO bytes. The number of the block group containing an inode can be calculated as }(hjhhhNhNubj)}(h.``(inode_number - 1) / sb.s_inodes_per_group``h]h*(inode_number - 1) / sb.s_inodes_per_group}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh-, and the offset into the group’s table is }(hjhhhNhNubj)}(h.``(inode_number - 1) % sb.s_inodes_per_group``h]h*(inode_number - 1) % sb.s_inodes_per_group}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. There is no inode 0.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hgThe inode checksum is calculated against the FS UUID, the inode number, and the inode structure itself.h]hgThe inode checksum is calculated against the FS UUID, the inode number, and the inode structure itself.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h;The inode table entry is laid out in ``struct ext4_inode``.h](h%The inode table entry is laid out in }(hjmhhhNhNubj)}(h``struct ext4_inode``h]hstruct ext4_inode}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh.}(hjmhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubhtable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhjubhthead)}(hhh]hrow)}(hhh](hentry)}(hhh]h)}(hOffseth]hOffset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK$hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hSizeh]hSize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK%hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hNameh]hName}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h Descriptionh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK'hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhjubhtbody)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK(hj:ubah}(h]h ]h"]h$]h&]uh1jhj7ubj)}(hhh]h)}(h__le16h]h__le16}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)hjQubah}(h]h ]h"]h$]h&]uh1jhj7ubj)}(hhh]h)}(hi_modeh]hi_mode}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK*hjhubah}(h]h ]h"]h$]h&]uh1jhj7ubj)}(hhh]h)}(h'File mode. See the table i_mode_ below.h](hFile mode. See the table }(hjhhhNhNubh reference)}(hi_mode_h]hi_mode}(hjhhhNhNubah}(h]h ]h"]h$]h&]namei_moderefidi-modeuh1jhjresolvedKubh below.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK+hjubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhj4ubj)}(hhh](j)}(hhh]h)}(h0x2h]h0x2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__le16h]h__le16}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK-hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hi_uidh]hi_uid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hLower 16-bits of Owner UID.h]hLower 16-bits of Owner UID.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK/hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj4ubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__le32h]h__le32}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK1hj4ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h i_size_loh]h i_size_lo}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hjKubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hLower 32-bits of size in bytes.h]hLower 32-bits of size in bytes.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK3hjbubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj4ubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__le32h]h__le32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK5hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hi_atimeh]hi_atime}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hLast access time, in seconds since the epoch. However, if the EA_INODE inode flag is set, this inode stores an extended attribute value and this field contains the checksum of the value.h]hLast access time, in seconds since the epoch. However, if the EA_INODE inode flag is set, this inode stores an extended attribute value and this field contains the checksum of the value.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK7hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj4ubj)}(hhh](j)}(hhh]h)}(h0xCh]h0xC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__le32h]h__le32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK;hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hi_ctimeh]hi_ctime}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK ubah}(h]h ]h"]h$]h&]uh1jhj$ ubj)}(hhh]h)}(h i_obso_faddrh]h i_obso_faddr}(hjX hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjU ubah}(h]h ]h"]h$]h&]uh1jhj$ ubj)}(hhh]h)}(h(Obsolete) fragment address.h]h(Obsolete) fragment address.}(hjo hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjl ubah}(h]h ]h"]h$]h&]uh1jhj$ ubeh}(h]h ]h"]h$]h&]uh1jhj4ubj)}(hhh](j)}(hhh]h)}(h0x74h]h0x74}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h12 bytesh]h12 bytes}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hi_osd2h]hi_osd2}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h'See the table i_osd2_ for more details.h](hSee the table }(hj hhhNhNubj)}(hi_osd2_h]hi_osd2}(hj hhhNhNubah}(h]h ]h"]h$]h&]namei_osd2ji-osd2uh1jhj jKubh for more details.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj4ubj)}(hhh](j)}(hhh]h)}(h0x80h]h0x80}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h__le16h]h__le16}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h i_extra_isizeh]h i_extra_isize}(hj7 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj4 ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hSize of this inode - 128. Alternately, the size of the extended inode fields beyond the original ext2 inode, including this field.h]hSize of this inode - 128. Alternately, the size of the extended inode fields beyond the original ext2 inode, including this field.}(hjN hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjK ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj4ubj)}(hhh](j)}(hhh]h)}(h0x82h]h0x82}(hjn hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjk ubah}(h]h ]h"]h$]h&]uh1jhjh ubj)}(hhh]h)}(h__le16h]h__le16}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhjh ubj)}(hhh]h)}(h i_checksum_hih]h i_checksum_hi}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhjh ubj)}(hhh]h)}(h$Upper 16-bits of the inode checksum.h]h$Upper 16-bits of the inode checksum.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhjh ubeh}(h]h ]h"]h$]h&]uh1jhj4ubj)}(hhh](j)}(hhh]h)}(h0x84h]h0x84}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h__le32h]h__le32}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h i_ctime_extrah]h i_ctime_extra}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hYExtra change time bits. This provides sub-second precision. See Inode Timestamps section.h]hYExtra change time bits. This provides sub-second precision. See Inode Timestamps section.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj4ubj)}(hhh](j)}(hhh]h)}(h0x88h]h0x88}(hj8 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj5 ubah}(h]h ]h"]h$]h&]uh1jhj2 ubj)}(hhh]h)}(h__le32h]h__le32}(hjO hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjL ubah}(h]h ]h"]h$]h&]uh1jhj2 ubj)}(hhh]h)}(h i_mtime_extrah]h i_mtime_extra}(hjf hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjc ubah}(h]h ]h"]h$]h&]uh1jhj2 ubj)}(hhh]h)}(hAExtra modification time bits. This provides sub-second precision.h]hAExtra modification time bits. This provides sub-second precision.}(hj} hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjz ubah}(h]h ]h"]h$]h&]uh1jhj2 ubeh}(h]h ]h"]h$]h&]uh1jhj4ubj)}(hhh](j)}(hhh]h)}(h0x8Ch]h0x8C}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h__le32h]h__le32}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h i_atime_extrah]h i_atime_extra}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h;Extra access time bits. This provides sub-second precision.h]h;Extra access time bits. This provides sub-second precision.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj4ubj)}(hhh](j)}(hhh]h)}(h0x90h]h0x90}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h__le32h]h__le32}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hi_crtimeh]hi_crtime}(hj0 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj- ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h/File creation time, in seconds since the epoch.h]h/File creation time, in seconds since the epoch.}(hjG hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjD ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj4ubj)}(hhh](j)}(hhh]h)}(h0x94h]h0x94}(hjg hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjd ubah}(h]h ]h"]h$]h&]uh1jhja ubj)}(hhh]h)}(h__le32h]h__le32}(hj~ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj{ ubah}(h]h ]h"]h$]h&]uh1jhja ubj)}(hhh]h)}(hi_crtime_extrah]hi_crtime_extra}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhja ubj)}(hhh]h)}(hBExtra file creation time bits. This provides sub-second precision.h]hBExtra file creation time bits. This provides sub-second precision.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhja ubeh}(h]h ]h"]h$]h&]uh1jhj4ubj)}(hhh](j)}(hhh]h)}(h0x98h]h0x98}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h__le32h]h__le32}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h i_version_hih]h i_version_hi}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h!Upper 32-bits for version number.h]h!Upper 32-bits for version number.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj4ubj)}(hhh](j)}(hhh]h)}(h0x9Ch]h0x9C}(hj1 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj. ubah}(h]h ]h"]h$]h&]uh1jhj+ ubj)}(hhh]h)}(h__le32h]h__le32}(hjH hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjE ubah}(h]h ]h"]h$]h&]uh1jhj+ ubj)}(hhh]h)}(hi_projidh]hi_projid}(hj_ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj\ ubah}(h]h ]h"]h$]h&]uh1jhj+ ubj)}(hhh]h)}(h Project ID.h]h Project ID.}(hjv hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjs ubah}(h]h ]h"]h$]h&]uh1jhj+ ubeh}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ](colwidths-given longtableeh"]h$]h&]uh1jhhhhhNhNubhtarget)}(h .. _i_mode:h]h}(h]h ]h"]h$]h&]jjuh1j hKhhhhhh referencedKubh)}(h=The ``i_mode`` value is a combination of the following flags:h](hThe }(hj hhhNhNubj)}(h ``i_mode``h]hi_mode}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh/ value is a combination of the following flags:}(hj hhhNhNubeh}(h]jah ]h"]i_modeah$]h&]uh1hhhhKhhhhexpect_referenced_by_name}j j sexpect_referenced_by_id}jj sj Kubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj ubj)}(hhh]h}(h]h ]h"]h$]h&]jK@uh1jhj ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hValueh]hValue}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h Descriptionh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x1h]h0x1}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj5ubah}(h]h ]h"]h$]h&]uh1jhj2ubj)}(hhh]h)}(hS_IXOTH (Others may execute)h]hS_IXOTH (Others may execute)}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjLubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h)}(h0x2h]h0x2}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjlubah}(h]h ]h"]h$]h&]uh1jhjiubj)}(hhh]h)}(hS_IWOTH (Others may write)h]hS_IWOTH (Others may write)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hS_IROTH (Others may read)h]hS_IROTH (Others may read)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h#S_IXGRP (Group members may execute)h]h#S_IXGRP (Group members may execute)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h)}(h0x10h]h0x10}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h!S_IWGRP (Group members may write)h]h!S_IWGRP (Group members may write)}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj(ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h)}(h0x20h]h0x20}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjHubah}(h]h ]h"]h$]h&]uh1jhjEubj)}(hhh]h)}(h S_IRGRP (Group members may read)h]h S_IRGRP (Group members may read)}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj_ubah}(h]h ]h"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h)}(h0x40h]h0x40}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhj|ubj)}(hhh]h)}(hS_IXUSR (Owner may execute)h]hS_IXUSR (Owner may execute)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h)}(h0x80h]h0x80}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hS_IWUSR (Owner may write)h]hS_IWUSR (Owner may write)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h)}(h0x100h]h0x100}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hS_IRUSR (Owner may read)h]hS_IRUSR (Owner may read)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h)}(h0x200h]h0x200}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj$ubah}(h]h ]h"]h$]h&]uh1jhj!ubj)}(hhh]h)}(hS_ISVTX (Sticky bit)h]hS_ISVTX (Sticky bit)}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj;ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h)}(h0x400h]h0x400}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj[ubah}(h]h ]h"]h$]h&]uh1jhjXubj)}(hhh]h)}(hS_ISGID (Set GID)h]hS_ISGID (Set GID)}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjrubah}(h]h ]h"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h)}(h0x800h]h0x800}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hS_ISUID (Set UID)h]hS_ISUID (Set UID)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h(These are mutually-exclusive file types:h]h(These are mutually-exclusive file types:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h)}(h0x1000h]h0x1000}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hS_IFIFO (FIFO)h]hS_IFIFO (FIFO)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h)}(h0x2000h]h0x2000}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj)ubah}(h]h ]h"]h$]h&]uh1jhj&ubj)}(hhh]h)}(hS_IFCHR (Character device)h]hS_IFCHR (Character device)}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj@ubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h)}(h0x4000h]h0x4000}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj`ubah}(h]h ]h"]h$]h&]uh1jhj]ubj)}(hhh]h)}(hS_IFDIR (Directory)h]hS_IFDIR (Directory)}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjwubah}(h]h ]h"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h)}(h0x6000h]h0x6000}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hS_IFBLK (Block device)h]hS_IFBLK (Block device)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h)}(h0x8000h]h0x8000}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hS_IFREG (Regular file)h]hS_IFREG (Regular file)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h)}(h0xA000h]h0xA000}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hS_IFLNK (Symbolic link)h]hS_IFLNK (Symbolic link)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh](j)}(hhh]h)}(h0xC000h]h0xC000}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj<ubah}(h]h ]h"]h$]h&]uh1jhj9ubj)}(hhh]h)}(hS_IFSOCK (Socket)h]hS_IFSOCK (Socket)}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjSubah}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1j2hj ubeh}(h]h ]h"]h$]h&]colsKuh1jhj ubah}(h]h ]j ah"]h$]h&]uh1jhhhhhNhNubj )}(h .. _i_flags:h]h}(h]h ]h"]h$]h&]jjuh1j hKhhhhhhj Kubh)}(h7The ``i_flags`` field is a combination of these values:h](hThe }(hjhhhNhNubj)}(h ``i_flags``h]hi_flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh( field is a combination of these values:}(hjhhhNhNubeh}(h]jah ]h"]i_flagsah$]h&]uh1hhhhKhhhhj }jjsj }jjsj Kubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jK@uh1jhjubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hValueh]hValue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h Descriptionh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhjubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x1h]h0x1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hEThis file requires secure deletion (EXT4_SECRM_FL). (not implemented)h]hEThis file requires secure deletion (EXT4_SECRM_FL). (not implemented)}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj%ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x2h]h0x2}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjEubah}(h]h ]h"]h$]h&]uh1jhjBubj)}(hhh]h)}(h]This file should be preserved, should undeletion be desired (EXT4_UNRM_FL). (not implemented)h]h]This file should be preserved, should undeletion be desired (EXT4_UNRM_FL). (not implemented)}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj\ubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj|ubah}(h]h ]h"]h$]h&]uh1jhjyubj)}(hhh]h)}(hAll directory entry data should be written synchronously (see }(hjhhhNhNubj)}(h ``dirsync``h]hdirsync}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) (EXT4_DIRSYNC_FL).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x20000h]h0x20000}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h,Top of directory hierarchy (EXT4_TOPDIR_FL).h]h,Top of directory hierarchy (EXT4_TOPDIR_FL).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x40000h]h0x40000}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h(This is a huge file (EXT4_HUGE_FILE_FL).h]h(This is a huge file (EXT4_HUGE_FILE_FL).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x80000h]h0x80000}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj5ubah}(h]h ]h"]h$]h&]uh1jhj2ubj)}(hhh]h)}(h%Inode uses extents (EXT4_EXTENTS_FL).h]h%Inode uses extents (EXT4_EXTENTS_FL).}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjLubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x100000h]h0x100000}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjlubah}(h]h ]h"]h$]h&]uh1jhjiubj)}(hhh]h)}(h'Verity protected file (EXT4_VERITY_FL).h]h'Verity protected file (EXT4_VERITY_FL).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x200000h]h0x200000}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hTInode stores a large extended attribute value in its data blocks (EXT4_EA_INODE_FL).h]hTInode stores a large extended attribute value in its data blocks (EXT4_EA_INODE_FL).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x400000h]h0x400000}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hIThis file has blocks allocated past EOF (EXT4_EOFBLOCKS_FL). (deprecated)h]hIThis file has blocks allocated past EOF (EXT4_EOFBLOCKS_FL). (deprecated)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h 0x01000000h]h 0x01000000}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h=Inode is a snapshot (``EXT4_SNAPFILE_FL``). (not in mainline)h](hInode is a snapshot (}(hj+hhhNhNubj)}(h``EXT4_SNAPFILE_FL``h]hEXT4_SNAPFILE_FL}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubh). (not in mainline)}(hj+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM!hj(ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h 0x04000000h]h 0x04000000}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM"hjZubah}(h]h ]h"]h$]h&]uh1jhjWubj)}(hhh]h)}(hKSnapshot is being deleted (``EXT4_SNAPFILE_DELETED_FL``). (not in mainline)h](hSnapshot is being deleted (}(hjthhhNhNubj)}(h``EXT4_SNAPFILE_DELETED_FL``h]hEXT4_SNAPFILE_DELETED_FL}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubh). (not in mainline)}(hjthhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM#hjqubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h 0x08000000h]h 0x08000000}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM%hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hNSnapshot shrink has completed (``EXT4_SNAPFILE_SHRUNK_FL``). (not in mainline)h](hSnapshot shrink has completed (}(hjhhhNhNubj)}(h``EXT4_SNAPFILE_SHRUNK_FL``h]hEXT4_SNAPFILE_SHRUNK_FL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh). (not in mainline)}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM&hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h 0x10000000h]h 0x10000000}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM(hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h,Inode has inline data (EXT4_INLINE_DATA_FL).h]h,Inode has inline data (EXT4_INLINE_DATA_FL).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM)hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h 0x20000000h]h 0x20000000}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM*hj#ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h?Create children with the same project ID (EXT4_PROJINHERIT_FL).h]h?Create children with the same project ID (EXT4_PROJINHERIT_FL).}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM+hj:ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h 0x80000000h]h 0x80000000}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM,hjZubah}(h]h ]h"]h$]h&]uh1jhjWubj)}(hhh]h)}(h-Reserved for ext4 library (EXT4_RESERVED_FL).h]h-Reserved for ext4 library (EXT4_RESERVED_FL).}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM-hjqubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hAggregate flags:h]hAggregate flags:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM/hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h 0x705BDFFFh]h 0x705BDFFF}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM0hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hUser-visible flags.h]hUser-visible flags.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM1hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h 0x604BC0FFh]h 0x604BC0FF}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM2hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hX;User-modifiable flags. Note that while EXT4_JOURNAL_DATA_FL and EXT4_EXTENTS_FL can be set with setattr, they are not in the kernel's EXT4_FL_USER_MODIFIABLE mask, since it needs to handle the setting of these flags in a special manner and they are masked out of the set of flags that are saved directly to i_flags.h]hX=User-modifiable flags. Note that while EXT4_JOURNAL_DATA_FL and EXT4_EXTENTS_FL can be set with setattr, they are not in the kernel’s EXT4_FL_USER_MODIFIABLE mask, since it needs to handle the setting of these flags in a special manner and they are masked out of the set of flags that are saved directly to i_flags.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM3hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]j ah"]h$]h&]uh1jhhhhhNhNubj )}(h .. _i_osd1:h]h}(h]h ]h"]h$]h&]jjyuh1j hMChhhhhhj Kubh)}(hBThe ``osd1`` field has multiple meanings depending on the creator:h](hThe }(hjBhhhNhNubj)}(h``osd1``h]hosd1}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubh6 field has multiple meanings depending on the creator:}(hjBhhhNhNubeh}(h]jyah ]h"]i_osd1ah$]h&]uh1hhhhM;hhhhj }j`j8sj }jyj8sj Kubh)}(hLinux:h]hLinux:}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM=hhhhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjvubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjvubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjvubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhjvubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMChjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hSizeh]hSize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMDhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hNameh]hName}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMEhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h Descriptionh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMFhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhjvubj3)}(hhh]j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMGhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__le32h]h__le32}(hj+hhhNhNubah}(h]h ]h"] h$]h&]uh1hhhhMHhj(ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h l_i_versionh]h l_i_version}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMIhj?ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hInode version. However, if the EA_INODE inode flag is set, this inode stores an extended attribute value and this field contains the upper 32 bits of the attribute value's reference count.h]hInode version. However, if the EA_INODE inode flag is set, this inode stores an extended attribute value and this field contains the upper 32 bits of the attribute value’s reference count.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMJhjVubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j2hjvubeh}(h]h ]h"]h$]h&]colsKuh1jhjsubah}(h]h ]j ah"]h$]h&]uh1jhhhhhNhNubh)}(hHurd:h]hHurd:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMNhhhhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhjubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMThjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hSizeh]hSize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMUhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hNameh]hName}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMVhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h Descriptionh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMWhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhjubj3)}(hhh]j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMXhj2ubah}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh]h)}(h__le32h]h__le32}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMYhjIubah}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh]h)}(hh_i_translatorh]hh_i_translator}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMZhj`ubah}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh]h)}(h??h]h??}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM[hjwubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]j ah"]h$]h&]uh1jhhhhhNhNubh)}(hMasix:h]hMasix:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM]hhhhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhjubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMchjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hSizeh]hSize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMdhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hNameh]hName}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMehjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h Descriptionh]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMfhj*ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhjubj3)}(hhh]j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMghjSubah}(h]h ]h"]h$]h&]uh1jhjPubj)}(hhh]h)}(h__le32h]h__le32}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhhjjubah}(h]h ]h"]h$]h&]uh1jhjPubj)}(hhh]h)}(h m_i_reservedh]h m_i_reserved}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMihjubah}(h]h ]h"]h$]h&]uh1jhjPubj)}(hhh]h)}(h??h]h??}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMjhjubah}(h]h ]h"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]j ah"]h$]h&]uh1jhhhhhNhNubj )}(h .. _i_osd2:h]h}(h]h ]h"]h$]h&]jj uh1j hMvhhhhhhj Kubh)}(hMThe ``osd2`` field has multiple meanings depending on the filesystem creator:h](hThe }(hjhhhNhNubj)}(h``osd2``h]hosd2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhA field has multiple meanings depending on the filesystem creator:}(hjhhhNhNubeh}(h]j ah ]h"]i_osd2ah$]h&]uh1hhhhMnhhhhj }jjsj }j jsj Kubh)}(hLinux:h]hLinux:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMphhhhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhjubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMvhj3ubah}(h]h ]h"]h$]h&]uh1jhj0ubj)}(hhh]h)}(hSizeh]hSize}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMwhjJubah}(h]h ]h"]h$]h&]uh1jhj0ubj)}(hhh]h)}(hNameh]hName}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMxhjaubah}(h]h ]h"]h$]h&]uh1jhj0ubj)}(hhh]h)}(h Descriptionh]h Description}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMyhjxubah}(h]h ]h"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhjubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMzhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__le16h]h__le16}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM{hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hl_i_blocks_highh]hl_i_blocks_high}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM|hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hNUpper 16-bits of the block count. Please see the note attached to i_blocks_lo.h]hNUpper 16-bits of the block count. Please see the note attached to i_blocks_lo.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM}hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x2h]h0x2}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__le16h]h__le16}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hl_i_file_acl_highh]hl_i_file_acl_high}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj4ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hUpper 16-bits of the extended attribute block (historically, the file ACL location). See the Extended Attributes section below.h]hUpper 16-bits of the extended attribute block (historically, the file ACL location). See the Extended Attributes section below.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjKubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjkubah}(h]h ]h"]h$]h&]uh1jhjhubj)}(hhh]h)}(h__le16h]h__le16}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjhubj)}(hhh]h)}(h l_i_uid_highh]h l_i_uid_high}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjhubj)}(hhh]h)}(hUpper 16-bits of the Owner UID.h]hUpper 16-bits of the Owner UID.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x6h]h0x6}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__le16h]h__le16}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h l_i_gid_highh]h l_i_gid_high}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hUpper 16-bits of the GID.h]hUpper 16-bits of the GID.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hj8 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj5 ubah}(h]h ]h"]h$]h&]uh1jhj2 ubj)}(hhh]h)}(h__le16h]h__le16}(hjO hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjL ubah}(h]h ]h"]h$]h&]uh1jhj2 ubj)}(hhh]h)}(hl_i_checksum_loh]hl_i_checksum_lo}(hjf hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjc ubah}(h]h ]h"]h$]h&]uh1jhj2 ubj)}(hhh]h)}(h$Lower 16-bits of the inode checksum.h]h$Lower 16-bits of the inode checksum.}(hj} hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjz ubah}(h]h ]h"]h$]h&]uh1jhj2 ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0xAh]h0xA}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h__le16h]h__le16}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h l_i_reservedh]h l_i_reserved}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hUnused.h]hUnused.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j2hjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]j ah"]h$]h&]uh1jhhhhhNhNubh)}(hHurd:h]hHurd:}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhhhhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj !ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj !ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj !ubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhj !ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hjP!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjM!ubah}(h]h ]h"]h$]h&]uh1jhjJ!ubj)}(hhh]h)}(hSizeh]hSize}(hjg!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjd!ubah}(h]h ]h"]h$]h&]uh1jhjJ!ubj)}(hhh]h)}(hNameh]hName}(hj~!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj{!ubah}(h]h ]h"]h$]h&]uh1jhjJ!ubj)}(hhh]h)}(h Descriptionh]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj!ubah}(h]h ]h"]h$]h&]uh1jhjJ!ubeh}(h]h ]h"]h$]h&]uh1jhjG!ubah}(h]h ]h"]h$]h&]uh1jhj !ubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj!ubah}(h]h ]h"]h$]h&]uh1jhj!ubj)}(hhh]h)}(h__le16h]h__le16}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj!ubah}(h]h ]h"]h$]h&]uh1jhj!ubj)}(hhh]h)}(h h_i_reserved1h]h h_i_reserved1}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj!ubah}(h]h ]h"]h$]h&]uh1jhj!ubj)}(hhh]h)}(h??h]h??}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj"ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhj!ubj)}(hhh](j)}(hhh]h)}(h0x2h]h0x2}(hj#"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj "ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(hhh]h)}(h__u16h]h__u16}(hj:"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj7"ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(hhh]h)}(h h_i_mode_highh]h h_i_mode_high}(hjQ"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjN"ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(hhh]h)}(hUpper 16-bits of the file mode.h]hUpper 16-bits of the file mode.}(hjh"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhje"ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jhj!ubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj"ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(hhh]h)}(h__le16h]h__le16}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj"ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(hhh]h)}(h h_i_uid_highh]h h_i_uid_high}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj"ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(hhh]h)}(hUpper 16-bits of the Owner UID.h]hUpper 16-bits of the Owner UID.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj"ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jhj!ubj)}(hhh](j)}(hhh]h)}(h0x6h]h0x6}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj"ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(hhh]h)}(h__le16h]h__le16}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj#ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(hhh]h)}(h h_i_gid_highh]h h_i_gid_high}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj#ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(hhh]h)}(hUpper 16-bits of the GID.h]hUpper 16-bits of the GID.}(hj2#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj/#ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jhj!ubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hjR#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjO#ubah}(h]h ]h"]h$]h&]uh1jhjL#ubj)}(hhh]h)}(h__u32h]h__u32}(hji#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjf#ubah}(h]h ]h"]h$]h&]uh1jhjL#ubj)}(hhh]h)}(h h_i_authorh]h h_i_author}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj}#ubah}(h]h ]h"]h$]h&]uh1jhjL#ubj)}(hhh]h)}(h Author code?h]h Author code?}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj#ubah}(h]h ]h"]h$]h&]uh1jhjL#ubeh}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1j2hj !ubeh}(h]h ]h"]h$]h&]colsKuh1jhj!ubah}(h]h ]j ah"]h$]h&]uh1jhhhhhNhNubh)}(hMasix:h]hMasix:}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhhhhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj#ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj#ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj#ubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhj#ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj$ubah}(h]h ]h"]h$]h&]uh1jhj#ubj)}(hhh]h)}(hSizeh]hSize}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj$ubah}(h]h ]h"]h$]h&]uh1jhj#ubj)}(hhh]h)}(hNameh]hName}(hj3$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj0$ubah}(h]h ]h"]h$]h&]uh1jhj#ubj)}(hhh]h)}(h Descriptionh]h Description}(hjJ$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjG$ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jhj#ubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hjs$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjp$ubah}(h]h ]h"]h$]h&]uh1jhjm$ubj)}(hhh]h)}(h__le16h]h__le16}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj$ubah}(h]h ]h"]h$]h&]uh1jhjm$ubj)}(hhh]h)}(h h_i_reserved1h]h h_i_reserved1}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj$ubah}(h]h ]h"]h$]h&]uh1jhjm$ubj)}(hhh]h)}(h??h]h??}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj$ubah}(h]h ]h"]h$]h&]uh1jhjm$ubeh}(h]h ]h"]h$]h&]uh1jhjj$ubj)}(hhh](j)}(hhh]h)}(h0x2h]h0x2}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj$ubah}(h]h ]h"]h$]h&]uh1jhj$ubj)}(hhh]h)}(h__u16h]h__u16}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj$ubah}(h]h ]h"]h$]h&]uh1jhj$ubj)}(hhh]h)}(hm_i_file_acl_highh]hm_i_file_acl_high}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj%ubah}(h]h ]h"]h$]h&]uh1jhj$ubj)}(hhh]h)}(hTUpper 16-bits of the extended attribute block (historically, the file ACL location).h]hTUpper 16-bits of the extended attribute block (historically, the file ACL location).}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj%ubah}(h]h ]h"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]uh1jhjj$ubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hj=%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj:%ubah}(h]h ]h"]h$]h&]uh1jhj7%ubj)}(hhh]h)}(h__u32h]h__u32}(hjT%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjQ%ubah}(h]h ]h"]h$]h&]uh1jhj7%ubj)}(hhh]h)}(hm_i_reserved2[2]h]hm_i_reserved2[2]}(hjk%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjh%ubah}(h]h ]h"]h$]h&]uh1jhj7%ubj)}(hhh]h)}(h??h]h??}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj%ubah}(h]h ]h"]h$]h&]uh1jhj7%ubeh}(h]h ]h"]h$]h&]uh1jhjj$ubeh}(h]h ]h"]h$]h&]uh1j2hj#ubeh}(h]h ]h"]h$]h&]colsKuh1jhj#ubah}(h]h ]j ah"]h$]h&]uh1jhhhhhNhNubh)}(hhh](h)}(h Inode Sizeh]h Inode Size}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hhhhhMubh)}(hXkIn ext2 and ext3, the inode structure size was fixed at 128 bytes (``EXT2_GOOD_OLD_INODE_SIZE``) and each inode had a disk record size of 128 bytes. Starting with ext4, it is possible to allocate a larger on-disk inode at format time for all inodes in the filesystem to provide space beyond the end of the original ext2 inode. The on-disk inode record size is recorded in the superblock as ``s_inode_size``. The number of bytes actually used by struct ext4_inode beyond the original 128-byte ext2 inode is recorded in the ``i_extra_isize`` field for each inode, which allows struct ext4_inode to grow for a new kernel without having to upgrade all of the on-disk inodes. Access to fields beyond EXT2_GOOD_OLD_INODE_SIZE should be verified to be within ``i_extra_isize``. By default, ext4 inode records are 256 bytes, and (as of August 2019) the inode structure is 160 bytes (``i_extra_isize = 32``). The extra space between the end of the inode structure and the end of the inode record can be used to store extended attributes. Each inode record can be as large as the filesystem block size, though this is not terribly efficient.h](hCIn ext2 and ext3, the inode structure size was fixed at 128 bytes (}(hj%hhhNhNubj)}(h``EXT2_GOOD_OLD_INODE_SIZE``h]hEXT2_GOOD_OLD_INODE_SIZE}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubhX') and each inode had a disk record size of 128 bytes. Starting with ext4, it is possible to allocate a larger on-disk inode at format time for all inodes in the filesystem to provide space beyond the end of the original ext2 inode. The on-disk inode record size is recorded in the superblock as }(hj%hhhNhNubj)}(h``s_inode_size``h]h s_inode_size}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubht. The number of bytes actually used by struct ext4_inode beyond the original 128-byte ext2 inode is recorded in the }(hj%hhhNhNubj)}(h``i_extra_isize``h]h i_extra_isize}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubh field for each inode, which allows struct ext4_inode to grow for a new kernel without having to upgrade all of the on-disk inodes. Access to fields beyond EXT2_GOOD_OLD_INODE_SIZE should be verified to be within }(hj%hhhNhNubj)}(h``i_extra_isize``h]h i_extra_isize}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubhj. By default, ext4 inode records are 256 bytes, and (as of August 2019) the inode structure is 160 bytes (}(hj%hhhNhNubj)}(h``i_extra_isize = 32``h]hi_extra_isize = 32}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubh). The extra space between the end of the inode structure and the end of the inode record can be used to store extended attributes. Each inode record can be as large as the filesystem block size, though this is not terribly efficient.}(hj%hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj%hhubeh}(h] inode-sizeah ]h"] inode sizeah$]h&]uh1hhhhhhhhMubh)}(hhh](h)}(hFinding an Inodeh]hFinding an Inode}(hj3&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0&hhhhhMubh)}(hXEach block group contains ``sb->s_inodes_per_group`` inodes. Because inode 0 is defined not to exist, this formula can be used to find the block group that an inode lives in: ``bg = (inode_num - 1) / sb->s_inodes_per_group``. The particular inode can be found within the block group's inode table at ``index = (inode_num - 1) % sb->s_inodes_per_group``. To get the byte address within the inode table, use ``offset = index * sb->s_inode_size``.h](hEach block group contains }(hjA&hhhNhNubj)}(h``sb->s_inodes_per_group``h]hsb->s_inodes_per_group}(hjI&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA&ubh{ inodes. Because inode 0 is defined not to exist, this formula can be used to find the block group that an inode lives in: }(hjA&hhhNhNubj)}(h1``bg = (inode_num - 1) / sb->s_inodes_per_group``h]h-bg = (inode_num - 1) / sb->s_inodes_per_group}(hj[&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA&ubhN. The particular inode can be found within the block group’s inode table at }(hjA&hhhNhNubj)}(h4``index = (inode_num - 1) % sb->s_inodes_per_group``h]h0index = (inode_num - 1) % sb->s_inodes_per_group}(hjm&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA&ubh6. To get the byte address within the inode table, use }(hjA&hhhNhNubj)}(h%``offset = index * sb->s_inode_size``h]h!offset = index * sb->s_inode_size}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA&ubh.}(hjA&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj0&hhubeh}(h]finding-an-inodeah ]h"]finding an inodeah$]h&]uh1hhhhhhhhMubh)}(hhh](h)}(hInode Timestampsh]hInode Timestamps}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hhhhhMubh)}(hXFour timestamps are recorded in the lower 128 bytes of the inode structure -- inode change time (ctime), access time (atime), data modification time (mtime), and deletion time (dtime). The four fields are 32-bit signed integers that represent seconds since the Unix epoch (1970-01-01 00:00:00 GMT), which means that the fields will overflow in January 2038. If the filesystem does not have orphan_file feature, inodes that are not linked from any directory but are still open (orphan inodes) have the dtime field overloaded for use with the orphan list. The superblock field ``s_last_orphan`` points to the first inode in the orphan list; dtime is then the number of the next orphaned inode, or zero if there are no more orphans.h](hX?Four timestamps are recorded in the lower 128 bytes of the inode structure -- inode change time (ctime), access time (atime), data modification time (mtime), and deletion time (dtime). The four fields are 32-bit signed integers that represent seconds since the Unix epoch (1970-01-01 00:00:00 GMT), which means that the fields will overflow in January 2038. If the filesystem does not have orphan_file feature, inodes that are not linked from any directory but are still open (orphan inodes) have the dtime field overloaded for use with the orphan list. The superblock field }(hj&hhhNhNubj)}(h``s_last_orphan``h]h s_last_orphan}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubh points to the first inode in the orphan list; dtime is then the number of the next orphaned inode, or zero if there are no more orphans.}(hj&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj&hhubh)}(hXIf the inode structure size ``sb->s_inode_size`` is larger than 128 bytes and the ``i_inode_extra`` field is large enough to encompass the respective ``i_[cma]time_extra`` field, the ctime, atime, and mtime inode fields are widened to 64 bits. Within this “extra” 32-bit field, the lower two bits are used to extend the 32-bit seconds field to be 34 bit wide; the upper 30 bits are used to provide nanosecond timestamp accuracy. Therefore, timestamps should not overflow until May 2446. dtime was not widened. There is also a fifth timestamp to record inode creation time (crtime); this field is 64-bits wide and decoded in the same manner as 64-bit [cma]time. Neither crtime nor dtime are accessible through the regular stat() interface, though debugfs will report them.h](hIf the inode structure size }(hj&hhhNhNubj)}(h``sb->s_inode_size``h]hsb->s_inode_size}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubh" is larger than 128 bytes and the }(hj&hhhNhNubj)}(h``i_inode_extra``h]h i_inode_extra}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubh3 field is large enough to encompass the respective }(hj&hhhNhNubj)}(h``i_[cma]time_extra``h]hi_[cma]time_extra}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubhX\ field, the ctime, atime, and mtime inode fields are widened to 64 bits. Within this “extra” 32-bit field, the lower two bits are used to extend the 32-bit seconds field to be 34 bit wide; the upper 30 bits are used to provide nanosecond timestamp accuracy. Therefore, timestamps should not overflow until May 2446. dtime was not widened. There is also a fifth timestamp to record inode creation time (crtime); this field is 64-bits wide and decoded in the same manner as 64-bit [cma]time. Neither crtime nor dtime are accessible through the regular stat() interface, though debugfs will report them.}(hj&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj&hhubh)}(hUWe use the 32-bit signed time value plus (2^32 * (extra epoch bits)). In other words:h]hUWe use the 32-bit signed time value plus (2^32 * (extra epoch bits)). In other words:}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj&hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj%'ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj%'ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj%'ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj%'ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj%'ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hExtra epoch bitsh]hExtra epoch bits}(hj^'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj['ubah}(h]h ]h"]h$]h&]uh1jhjX'ubj)}(hhh]h)}(hMSB of 32-bit timeh]hMSB of 32-bit time}(hju'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjr'ubah}(h]h ]h"]h$]h&]uh1jhjX'ubj)}(hhh]h)}(h-Adjustment for signed 32-bit to 64-bit tv_sech]h-Adjustment for signed 32-bit to 64-bit tv_sec}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj'ubah}(h]h ]h"]h$]h&]uh1jhjX'ubj)}(hhh]h)}(hDecoded 64-bit tv_sech]hDecoded 64-bit tv_sec}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj'ubah}(h]h ]h"]h$]h&]uh1jhjX'ubj)}(hhh]h)}(hvalid time rangeh]hvalid time range}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj'ubah}(h]h ]h"]h$]h&]uh1jhjX'ubeh}(h]h ]h"]h$]h&]uh1jhjU'ubah}(h]h ]h"]h$]h&]uh1jhj%'ubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(h0 0h]h0 0}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj'ubah}(h]h ]h"]h$]h&]uh1jhj'ubj)}(hhh]h)}(h1h]h1}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj'ubah}(h]h ]h"]h$]h&]uh1jhj'ubj)}(hhh]h)}(h0h]h0}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj(ubah}(h]h ]h"]h$]h&]uh1jhj'ubj)}(hhh]h)}(h``-0x80000000 - -0x00000001``h]j)}(hj*(h]h-0x80000000 - -0x00000001}(hj,(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj((ubah}(h]h ]h"]h$]h&]uh1hhhhMhj%(ubah}(h]h ]h"]h$]h&]uh1jhj'ubj)}(hhh]h)}(h1901-12-13 to 1969-12-31h]h1901-12-13 to 1969-12-31}(hjH(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjE(ubah}(h]h ]h"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]uh1jhj'ubj)}(hhh](j)}(hhh]h)}(h0 0h]h0 0}(hjh(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhje(ubah}(h]h ]h"]h$]h&]uh1jhjb(ubj)}(hhh]h)}(hj(h]h0}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj|(ubah}(h]h ]h"]h$]h&]uh1jhjb(ubj)}(hhh]h)}(hj(h]h0}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj(ubah}(h]h ]h"]h$]h&]uh1jhjb(ubj)}(hhh]h)}(h``0x000000000 - 0x07fffffff``h]j)}(hj(h]h0x000000000 - 0x07fffffff}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hhhhMhj(ubah}(h]h ]h"]h$]h&]uh1jhjb(ubj)}(hhh]h)}(h1970-01-01 to 2038-01-19h]h1970-01-01 to 2038-01-19}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj(ubah}(h]h ]h"]h$]h&]uh1jhjb(ubeh}(h]h ]h"]h$]h&]uh1jhj'ubj)}(hhh](j)}(hhh]h)}(h0 1h]h0 1}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj(ubah}(h]h ]h"]h$]h&]uh1jhj(ubj)}(hhh]h)}(hj'h]h1}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj(ubah}(h]h ]h"]h$]h&]uh1jhj(ubj)}(hhh]h)}(h 0x100000000h]h 0x100000000}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj)ubah}(h]h ]h"]h$]h&]uh1jhj(ubj)}(hhh]h)}(h``0x080000000 - 0x0ffffffff``h]j)}(hj1)h]h0x080000000 - 0x0ffffffff}(hj3)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/)ubah}(h]h ]h"]h$]h&]uh1hhhhM hj,)ubah}(h]h ]h"]h$]h&]uh1jhj(ubj)}(hhh]h)}(h2038-01-19 to 2106-02-07h]h2038-01-19 to 2106-02-07}(hjO)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM!hjL)ubah}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]uh1jhj'ubj)}(hhh](j)}(hhh]h)}(h0 1h]h0 1}(hjo)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM"hjl)ubah}(h]h ]h"]h$]h&]uh1jhji)ubj)}(hhh]h)}(hj(h]h0}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM#hj)ubah}(h]h ]h"]h$]h&]uh1jhji)ubj)}(hhh]h)}(h 0x100000000h]h 0x100000000}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM$hj)ubah}(h]h ]h"]h$]h&]uh1jhji)ubj)}(hhh]h)}(h``0x100000000 - 0x17fffffff``h]j)}(hj)h]h0x100000000 - 0x17fffffff}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1hhhhM%hj)ubah}(h]h ]h"]h$]h&]uh1jhji)ubj)}(hhh]h)}(h2106-02-07 to 2174-02-25h]h2106-02-07 to 2174-02-25}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM&hj)ubah}(h]h ]h"]h$]h&]uh1jhji)ubeh}(h]h ]h"]h$]h&]uh1jhj'ubj)}(hhh](j)}(hhh]h)}(h1 0h]h1 0}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM'hj)ubah}(h]h ]h"]h$]h&]uh1jhj)ubj)}(hhh]h)}(hj'h]h1}(hj *hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM(hj*ubah}(h]h ]h"]h$]h&]uh1jhj)ubj)}(hhh]h)}(h 0x200000000h]h 0x200000000}(hj *hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM)hj*ubah}(h]h ]h"]h$]h&]uh1jhj)ubj)}(hhh]h)}(h``0x180000000 - 0x1ffffffff``h]j)}(hj9*h]h0x180000000 - 0x1ffffffff}(hj;*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7*ubah}(h]h ]h"]h$]h&]uh1hhhhM*hj4*ubah}(h]h ]h"]h$]h&]uh1jhj)ubj)}(hhh]h)}(h2174-02-25 to 2242-03-16h]h2174-02-25 to 2242-03-16}(hjW*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM+hjT*ubah}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]uh1jhj'ubj)}(hhh](j)}(hhh]h)}(h1 0h]h1 0}(hjw*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM,hjt*ubah}(h]h ]h"]h$]h&]uh1jhjq*ubj)}(hhh]h)}(hj(h]h0}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM-hj*ubah}(h]h ]h"]h$]h&]uh1jhjq*ubj)}(hhh]h)}(h 0x200000000h]h 0x200000000}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM.hj*ubah}(h]h ]h"]h$]h&]uh1jhjq*ubj)}(hhh]h)}(h``0x200000000 - 0x27fffffff``h]j)}(hj*h]h0x200000000 - 0x27fffffff}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hhhhM/hj*ubah}(h]h ]h"]h$]h&]uh1jhjq*ubj)}(hhh]h)}(h2242-03-16 to 2310-04-04h]h2242-03-16 to 2310-04-04}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM0hj*ubah}(h]h ]h"]h$]h&]uh1jhjq*ubeh}(h]h ]h"]h$]h&]uh1jhj'ubj)}(hhh](j)}(hhh]h)}(h1 1h]h1 1}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM1hj*ubah}(h]h ]h"]h$]h&]uh1jhj*ubj)}(hhh]h)}(hj'h]h1}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM2hj+ubah}(h]h ]h"]h$]h&]uh1jhj*ubj)}(hhh]h)}(h 0x300000000h]h 0x300000000}(hj(+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM3hj%+ubah}(h]h ]h"]h$]h&]uh1jhj*ubj)}(hhh]h)}(h``0x280000000 - 0x2ffffffff``h]j)}(hjA+h]h0x280000000 - 0x2ffffffff}(hjC+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?+ubah}(h]h ]h"]h$]h&]uh1hhhhM4hj<+ubah}(h]h ]h"]h$]h&]uh1jhj*ubj)}(hhh]h)}(h2310-04-04 to 2378-04-22h]h2310-04-04 to 2378-04-22}(hj_+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM5hj\+ubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhj'ubj)}(hhh](j)}(hhh]h)}(h1 1h]h1 1}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM6hj|+ubah}(h]h ]h"]h$]h&]uh1jhjy+ubj)}(hhh]h)}(hj(h]h0}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM7hj+ubah}(h]h ]h"]h$]h&]uh1jhjy+ubj)}(hhh]h)}(h 0x300000000h]h 0x300000000}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM8hj+ubah}(h]h ]h"]h$]h&]uh1jhjy+ubj)}(hhh]h)}(h``0x300000000 - 0x37fffffff``h]j)}(hj+h]h0x300000000 - 0x37fffffff}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hhhhM9hj+ubah}(h]h ]h"]h$]h&]uh1jhjy+ubj)}(hhh]h)}(h2378-04-22 to 2446-05-10h]h2378-04-22 to 2446-05-10}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM:hj+ubah}(h]h ]h"]h$]h&]uh1jhjy+ubeh}(h]h ]h"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]uh1j2hj%'ubeh}(h]h ]h"]h$]h&]colsKuh1jhj"'ubah}(h]h ]j ah"]h$]h&]uh1jhj&hhhNhNubh)}(hXThis is a somewhat odd encoding since there are effectively seven times as many positive values as negative values. There have also been long-standing bugs decoding and encoding dates beyond 2038, which don't seem to be fixed as of kernel 3.12 and e2fsprogs 1.42.8. 64-bit kernels incorrectly use the extra epoch bits 1,1 for dates between 1901 and 1970. At some point the kernel will be fixed and e2fsck will fix this situation, assuming that it is run before 2310.h]hXThis is a somewhat odd encoding since there are effectively seven times as many positive values as negative values. There have also been long-standing bugs decoding and encoding dates beyond 2038, which don’t seem to be fixed as of kernel 3.12 and e2fsprogs 1.42.8. 64-bit kernels incorrectly use the extra epoch bits 1,1 for dates between 1901 and 1970. At some point the kernel will be fixed and e2fsck will fix this situation, assuming that it is run before 2310.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM<hj&hhubh)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hj,sbah}(h]h ]h"]h$]h&]hhuh1hhj&hhh(Documentation/filesystems/ext4/ifork.rsthKubeh}(h]inode-timestampsah ]h"]inode timestampsah$]h&]uh1hhhhhhhhMubeh}(h] index-nodesah ]h"] index nodesah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hThe Contents of inode.i_blockh]hThe Contents of inode.i_block}(hj@,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=,hhhj,,hKubh)}(hX Depending on the type of file an inode describes, the 60 bytes of storage in ``inode.i_block`` can be used in different ways. In general, regular files and directories will use it for file block indexing information, and special files will use it for special purposes.h](hMDepending on the type of file an inode describes, the 60 bytes of storage in }(hjN,hhhNhNubj)}(h``inode.i_block``h]h inode.i_block}(hjV,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjN,ubh can be used in different ways. In general, regular files and directories will use it for file block indexing information, and special files will use it for special purposes.}(hjN,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,,hKhj=,hhubh)}(hhh](h)}(hSymbolic Linksh]hSymbolic Links}(hjq,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjn,hhhj,,hK ubh)}(hThe target of a symbolic link will be stored in this field if the target string is less than 60 bytes long. Otherwise, either extents or block maps will be used to allocate data blocks to store the link target.h]hThe target of a symbolic link will be stored in this field if the target string is less than 60 bytes long. Otherwise, either extents or block maps will be used to allocate data blocks to store the link target.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhjn,hhubeh}(h]symbolic-linksah ]h"]symbolic linksah$]h&]uh1hhj=,hhhj,,hK ubh)}(hhh](h)}(h Direct/Indirect Block Addressingh]h Direct/Indirect Block Addressing}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hhhj,,hKubh)}(hXIn ext2/3, file block numbers were mapped to logical block numbers by means of an (up to) three level 1-1 block map. To find the logical block that stores a particular file block, the code would navigate through this increasingly complicated structure. Notice that there is neither a magic number nor a checksum to provide any level of confidence that the block isn't full of garbage.h]hXIn ext2/3, file block numbers were mapped to logical block numbers by means of an (up to) three level 1-1 block map. To find the logical block that stores a particular file block, the code would navigate through this increasingly complicated structure. Notice that there is neither a magic number nor a checksum to provide any level of confidence that the block isn’t full of garbage.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj,hhubsphinx.ext.ifconfigifconfig)}(hhh](h)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hj,sbah}(h]h ]h"]h$]h&]hhuh1hhj,hhh+Documentation/filesystems/ext4/blockmap.rsthKubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhj,ubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhj,ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hi.i_block Offseth]hi.i_block Offset}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hKhj,ubah}(h]h ]h"]h$]h&]uh1jhj,ubj)}(hhh]h)}(hWhere It Pointsh]hWhere It Points}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hKhj-ubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jhj,ubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(h0 to 11h]h0 to 11}(hj,-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hKhj)-ubah}(h]h ]h"]h$]h&]uh1jhj&-ubj)}(hhh]h)}(h"Direct map to file blocks 0 to 11.h]h"Direct map to file blocks 0 to 11.}(hjC-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hKhj@-ubah}(h]h ]h"]h$]h&]uh1jhj&-ubeh}(h]h ]h"]h$]h&]uh1jhj#-ubj)}(hhh](j)}(hhh]h)}(h12h]h12}(hjc-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hKhj`-ubah}(h]h ]h"]h$]h&]uh1jhj]-ubj)}(hhh](h)}(h\Indirect block: (file blocks 12 to (``$block_size`` / 4) + 11, or 12 to 1035 if 4KiB blocks)h](h$Indirect block: (file blocks 12 to (}(hjz-hhhNhNubj)}(h``$block_size``h]h $block_size}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjz-ubh) / 4) + 11, or 12 to 1035 if 4KiB blocks)}(hjz-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,hKhjw-ubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhj-ubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKDuh1jhj-ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hIndirect Block Offseth]hIndirect Block Offset}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hK hj-ubah}(h]h ]h"]h$]h&]uh1jhj-ubj)}(hhh]h)}(hWhere It Pointsh]hWhere It Points}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hK hj-ubah}(h]h ]h"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhj-ubj3)}(hhh]j)}(hhh](j)}(hhh]h)}(h0 to (``$block_size`` / 4)h](h0 to (}(hj-hhhNhNubj)}(h``$block_size``h]h $block_size}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubh / 4)}(hj-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,hK hj-ubah}(h]h ]h"]h$]h&]uh1jhj-ubj)}(hhh]h)}(h@Direct map to (``$block_size`` / 4) blocks (1024 if 4KiB blocks)h](hDirect map to (}(hj&.hhhNhNubj)}(h``$block_size``h]h $block_size}(hj..hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&.ubh" / 4) blocks (1024 if 4KiB blocks)}(hj&.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,hK hj#.ubah}(h]h ]h"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1j2hj-ubeh}(h]h ]h"]h$]h&]colsKuh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhjw-ubeh}(h]h ]h"]h$]h&]uh1jhj]-ubeh}(h]h ]h"]h$]h&]uh1jhj#-ubj)}(hhh](j)}(hhh]h)}(h13h]h13}(hjw.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hKhjt.ubah}(h]h ]h"]h$]h&]uh1jhjq.ubj)}(hhh](h)}(hDouble-indirect block: (file blocks ``$block_size``/4 + 12 to (``$block_size`` / 4) ^ 2 + (``$block_size`` / 4) + 11, or 1036 to 1049611 if 4KiB blocks)h](h$Double-indirect block: (file blocks }(hj.hhhNhNubj)}(h``$block_size``h]h $block_size}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh /4 + 12 to (}(hj.hhhNhNubj)}(h``$block_size``h]h $block_size}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh / 4) ^ 2 + (}(hj.hhhNhNubj)}(h``$block_size``h]h $block_size}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh. / 4) + 11, or 1036 to 1049611 if 4KiB blocks)}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,hKhj.ubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthK uh1jhj.ubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKiuh1jhj.ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hDouble Indirect Block Offseth]hDouble Indirect Block Offset}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hKhj.ubah}(h]h ]h"]h$]h&]uh1jhj.ubj)}(hhh]h)}(hWhere It Pointsh]hWhere It Points}(hj /hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hKhj /ubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhj.ubj3)}(hhh]j)}(hhh](j)}(hhh]h)}(h0 to (``$block_size`` / 4)h](h0 to (}(hj5/hhhNhNubj)}(h``$block_size``h]h $block_size}(hj=/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5/ubh / 4)}(hj5/hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,hKhj2/ubah}(h]h ]h"]h$]h&]uh1jhj//ubj)}(hhh](h)}(hBMap to (``$block_size`` / 4) indirect blocks (1024 if 4KiB blocks)h](hMap to (}(hj^/hhhNhNubj)}(h``$block_size``h]h $block_size}(hjf/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^/ubh+ / 4) indirect blocks (1024 if 4KiB blocks)}(hj^/hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,hKhj[/ubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhj/ubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKDuh1jhj/ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hIndirect Block Offseth]hIndirect Block Offset}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hKhj/ubah}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh]h)}(hWhere It Pointsh]hWhere It Points}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hKhj/ubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jhj/ubj3)}(hhh]j)}(hhh](j)}(hhh]h)}(h0 to (``$block_size`` / 4)h](h0 to (}(hj/hhhNhNubj)}(h``$block_size``h]h $block_size}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubh / 4)}(hj/hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,hKhj/ubah}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh]h)}(h@Direct map to (``$block_size`` / 4) blocks (1024 if 4KiB blocks)h](hDirect map to (}(hj 0hhhNhNubj)}(h``$block_size``h]h $block_size}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 0ubh" / 4) blocks (1024 if 4KiB blocks)}(hj 0hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,hKhj0ubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1j2hj/ubeh}(h]h ]h"]h$]h&]colsKuh1jhj~/ubah}(h]h ]h"]h$]h&]uh1jhj[/ubeh}(h]h ]h"]h$]h&]uh1jhj//ubeh}(h]h ]h"]h$]h&]uh1jhj,/ubah}(h]h ]h"]h$]h&]uh1j2hj.ubeh}(h]h ]h"]h$]h&]colsKuh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhjq.ubeh}(h]h ]h"]h$]h&]uh1jhj#-ubj)}(hhh](j)}(hhh]h)}(h14h]h14}(hjz0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hKhjw0ubah}(h]h ]h"]h$]h&]uh1jhjt0ubj)}(hhh](h)}(hTriple-indirect block: (file blocks (``$block_size`` / 4) ^ 2 + (``$block_size`` / 4) + 12 to (``$block_size`` / 4) ^ 3 + (``$block_size`` / 4) ^ 2 + (``$block_size`` / 4) + 12, or 1049612 to 1074791436 if 4KiB blocks)h](h%Triple-indirect block: (file blocks (}(hj0hhhNhNubj)}(h``$block_size``h]h $block_size}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubh / 4) ^ 2 + (}(hj0hhhNhNubj)}(h``$block_size``h]h $block_size}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubh / 4) + 12 to (}(hj0hhhNhNubj)}(h``$block_size``h]h $block_size}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubh / 4) ^ 3 + (}(hj0hhhNhNubj)}(h``$block_size``h]h $block_size}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubh / 4) ^ 2 + (}hj0sbj)}(h``$block_size``h]h $block_size}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubh4 / 4) + 12, or 1049612 to 1074791436 if 4KiB blocks)}(hj0hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,hKhj0ubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthK uh1jhj0ubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhj0ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hTriple Indirect Block Offseth]hTriple Indirect Block Offset}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hK!hj1ubah}(h]h ]h"]h$]h&]uh1jhj1ubj)}(hhh]h)}(hWhere It Pointsh]hWhere It Points}(hj31hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hK!hj01ubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jhj0ubj3)}(hhh]j)}(hhh](j)}(hhh]h)}(h0 to (``$block_size`` / 4)h](h0 to (}(hj\1hhhNhNubj)}(h``$block_size``h]h $block_size}(hjd1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\1ubh / 4)}(hj\1hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,hK#hjY1ubah}(h]h ]h"]h$]h&]uh1jhjV1ubj)}(hhh](h)}(hIMap to (``$block_size`` / 4) double indirect blocks (1024 if 4KiB blocks)h](hMap to (}(hj1hhhNhNubj)}(h``$block_size``h]h $block_size}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubh2 / 4) double indirect blocks (1024 if 4KiB blocks)}(hj1hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,hK#hj1ubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthK uh1jhj1ubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKiuh1jhj1ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hDouble Indirect Block Offseth]hDouble Indirect Block Offset}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hK&hj1ubah}(h]h ]h"]h$]h&]uh1jhj1ubj)}(hhh]h)}(hWhere It Pointsh]hWhere It Points}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hK&hj1ubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jhj1ubj3)}(hhh]j)}(hhh](j)}(hhh]h)}(h0 to (``$block_size`` / 4)h](h0 to (}(hj2hhhNhNubj)}(h``$block_size``h]h $block_size}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh / 4)}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,hK(hj2ubah}(h]h ]h"]h$]h&]uh1jhj2ubj)}(hhh](h)}(hBMap to (``$block_size`` / 4) indirect blocks (1024 if 4KiB blocks)h](hMap to (}(hj12hhhNhNubj)}(h``$block_size``h]h $block_size}(hj92hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj12ubh+ / 4) indirect blocks (1024 if 4KiB blocks)}(hj12hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,hK(hj.2ubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjT2ubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKDuh1jhjT2ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hIndirect Block Offseth]hIndirect Block Offset}(hjt2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hK+hjq2ubah}(h]h ]h"]h$]h&]uh1jhjn2ubj)}(hhh]h)}(hWhere It Pointsh]hWhere It Points}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hK+hj2ubah}(h]h ]h"]h$]h&]uh1jhjn2ubeh}(h]h ]h"]h$]h&]uh1jhjk2ubah}(h]h ]h"]h$]h&]uh1jhjT2ubj3)}(hhh]j)}(hhh](j)}(hhh]h)}(h0 to (``$block_size`` / 4)h](h0 to (}(hj2hhhNhNubj)}(h``$block_size``h]h $block_size}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh / 4)}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,hK-hj2ubah}(h]h ]h"]h$]h&]uh1jhj2ubj)}(hhh]h)}(h@Direct map to (``$block_size`` / 4) blocks (1024 if 4KiB blocks)h](hDirect map to (}(hj2hhhNhNubj)}(h``$block_size``h]h $block_size}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh" / 4) blocks (1024 if 4KiB blocks)}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,hK-hj2ubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1j2hjT2ubeh}(h]h ]h"]h$]h&]colsKuh1jhjQ2ubah}(h]h ]h"]h$]h&]uh1jhj.2ubeh}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1j2hj1ubeh}(h]h ]h"]h$]h&]colsKuh1jhj1ubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhjV1ubeh}(h]h ]h"]h$]h&]uh1jhjS1ubah}(h]h ]h"]h$]h&]uh1j2hj0ubeh}(h]h ]h"]h$]h&]colsKuh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]uh1jhjt0ubeh}(h]h ]h"]h$]h&]uh1jhj#-ubeh}(h]h ]h"]h$]h&]uh1j2hj,ubeh}(h]h ]h"]h$]h&]colsKuh1jhj,ubah}(h]h ]h"]h$]h&]uh1jhj,hhhj,hNubeh}(h]h ]h"]h$]h&]exprbuilder != 'latex'uh1j,hhhj,,hKhj,ubj,)}(hhh]h)}(h<[Table omitted because LaTeX doesn't support nested tables.]h]h>[Table omitted because LaTeX doesn’t support nested tables.]}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hK"hj3hhubah}(h]h ]h"]h$]h&]j3builder == 'latex'uh1j,hhhj,,hK hj,ubh)}(hNote that with this block mapping scheme, it is necessary to fill out a lot of mapping data even for a large contiguous file! This inefficiency led to the creation of the extent mapping scheme, discussed below.h]hNote that with this block mapping scheme, it is necessary to fill out a lot of mapping data even for a large contiguous file! This inefficiency led to the creation of the extent mapping scheme, discussed below.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hK$hj,hhubh)}(h[Notice also that a file using this mapping scheme cannot be placed higher than 2^32 blocks.h]h[Notice also that a file using this mapping scheme cannot be placed higher than 2^32 blocks.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hK(hj,hhubeh}(h] direct-indirect-block-addressingah ]h"] direct/indirect block addressingah$]h&]uh1hhj=,hhhj,,hKubh)}(hhh](h)}(h Extent Treeh]h Extent Tree}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hhhj,,hK,ubh)}(hX0In ext4, the file to logical block map has been replaced with an extent tree. Under the old scheme, allocating a contiguous run of 1,000 blocks requires an indirect block to map all 1,000 entries; with extents, the mapping is reduced to a single ``struct ext4_extent`` with ``ee_len = 1000``. If flex_bg is enabled, it is possible to allocate very large files with a single extent, at a considerable reduction in metadata block use, and some improvement in disk efficiency. The inode must have the extents flag (0x80000) flag set for this feature to be in use.h](hIn ext4, the file to logical block map has been replaced with an extent tree. Under the old scheme, allocating a contiguous run of 1,000 blocks requires an indirect block to map all 1,000 entries; with extents, the mapping is reduced to a single }(hj3hhhNhNubj)}(h``struct ext4_extent``h]hstruct ext4_extent}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh with }(hj3hhhNhNubj)}(h``ee_len = 1000``h]h ee_len = 1000}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubhX . If flex_bg is enabled, it is possible to allocate very large files with a single extent, at a considerable reduction in metadata block use, and some improvement in disk efficiency. The inode must have the extents flag (0x80000) flag set for this feature to be in use.}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,,hK.hj3hhubh)}(hXExtents are arranged as a tree. Each node of the tree begins with a ``struct ext4_extent_header``. If the node is an interior node (``eh.eh_depth`` > 0), the header is followed by ``eh.eh_entries`` instances of ``struct ext4_extent_idx``; each of these index entries points to a block containing more nodes in the extent tree. If the node is a leaf node (``eh.eh_depth == 0``), then the header is followed by ``eh.eh_entries`` instances of ``struct ext4_extent``; these instances point to the file's data blocks. The root node of the extent tree is stored in ``inode.i_block``, which allows for the first four extents to be recorded without the use of extra metadata blocks.h](hDExtents are arranged as a tree. Each node of the tree begins with a }(hj4hhhNhNubj)}(h``struct ext4_extent_header``h]hstruct ext4_extent_header}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubh#. If the node is an interior node (}(hj4hhhNhNubj)}(h``eh.eh_depth``h]h eh.eh_depth}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubh! > 0), the header is followed by }(hj4hhhNhNubj)}(h``eh.eh_entries``h]h eh.eh_entries}(hj,4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubh instances of }(hj4hhhNhNubj)}(h``struct ext4_extent_idx``h]hstruct ext4_extent_idx}(hj>4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubhv; each of these index entries points to a block containing more nodes in the extent tree. If the node is a leaf node (}(hj4hhhNhNubj)}(h``eh.eh_depth == 0``h]heh.eh_depth == 0}(hjP4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubh"), then the header is followed by }(hj4hhhNhNubj)}(h``eh.eh_entries``h]h eh.eh_entries}(hjb4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubh instances of }(hj4hhhNhNubj)}(h``struct ext4_extent``h]hstruct ext4_extent}(hjt4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubhc; these instances point to the file’s data blocks. The root node of the extent tree is stored in }(hj4hhhNhNubj)}(h``inode.i_block``h]h inode.i_block}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubhb, which allows for the first four extents to be recorded without the use of extra metadata blocks.}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,,hK8hj3hhubh)}(h\The extent tree header is recorded in ``struct ext4_extent_header``, which is 12 bytes long:h](h&The extent tree header is recorded in }(hj4hhhNhNubj)}(h``struct ext4_extent_header``h]hstruct ext4_extent_header}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubh, which is 12 bytes long:}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,,hKChj3hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj4ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj4ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj4ubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhj4ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKJhj4ubah}(h]h ]h"]h$]h&]uh1jhj4ubj)}(hhh]h)}(hSizeh]hSize}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKKhj5ubah}(h]h ]h"]h$]h&]uh1jhj4ubj)}(hhh]h)}(hNameh]hName}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKLhj5ubah}(h]h ]h"]h$]h&]uh1jhj4ubj)}(hhh]h)}(h Descriptionh]h Description}(hj65hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKMhj35ubah}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jhj4ubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hj_5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKNhj\5ubah}(h]h ]h"]h$]h&]uh1jhjY5ubj)}(hhh]h)}(h__le16h]h__le16}(hjv5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKOhjs5ubah}(h]h ]h"]h$]h&]uh1jhjY5ubj)}(hhh]h)}(heh_magich]heh_magic}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKPhj5ubah}(h]h ]h"]h$]h&]uh1jhjY5ubj)}(hhh]h)}(hMagic number, 0xF30A.h]hMagic number, 0xF30A.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKQhj5ubah}(h]h ]h"]h$]h&]uh1jhjY5ubeh}(h]h ]h"]h$]h&]uh1jhjV5ubj)}(hhh](j)}(hhh]h)}(h0x2h]h0x2}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKRhj5ubah}(h]h ]h"]h$]h&]uh1jhj5ubj)}(hhh]h)}(h__le16h]h__le16}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKShj5ubah}(h]h ]h"]h$]h&]uh1jhj5ubj)}(hhh]h)}(h eh_entriesh]h eh_entries}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKThj5ubah}(h]h ]h"]h$]h&]uh1jhj5ubj)}(hhh]h)}(h-Number of valid entries following the header.h]h-Number of valid entries following the header.}(hj 6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKUhj6ubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jhjV5ubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hj)6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKVhj&6ubah}(h]h ]h"]h$]h&]uh1jhj#6ubj)}(hhh]h)}(h__le16h]h__le16}(hj@6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKWhj=6ubah}(h]h ]h"]h$]h&]uh1jhj#6ubj)}(hhh]h)}(heh_maxh]heh_max}(hjW6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKXhjT6ubah}(h]h ]h"]h$]h&]uh1jhj#6ubj)}(hhh]h)}(h7Maximum number of entries that could follow the header.h]h7Maximum number of entries that could follow the header.}(hjn6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKYhjk6ubah}(h]h ]h"]h$]h&]uh1jhj#6ubeh}(h]h ]h"]h$]h&]uh1jhjV5ubj)}(hhh](j)}(hhh]h)}(h0x6h]h0x6}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKZhj6ubah}(h]h ]h"]h$]h&]uh1jhj6ubj)}(hhh]h)}(h__le16h]h__le16}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hK[hj6ubah}(h]h ]h"]h$]h&]uh1jhj6ubj)}(hhh]h)}(heh_depthh]heh_depth}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hK\hj6ubah}(h]h ]h"]h$]h&]uh1jhj6ubj)}(hhh]h)}(hXEDepth of this extent node in the extent tree. 0 = this extent node points to data blocks; otherwise, this extent node points to other extent nodes. The extent tree can be at most 5 levels deep: a logical block number can be at most ``2^32``, and the smallest ``n`` that satisfies ``4*(((blocksize - 12)/12)^n) >= 2^32`` is 5.h](hDepth of this extent node in the extent tree. 0 = this extent node points to data blocks; otherwise, this extent node points to other extent nodes. The extent tree can be at most 5 levels deep: a logical block number can be at most }(hj6hhhNhNubj)}(h``2^32``h]h2^32}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubh, and the smallest }(hj6hhhNhNubj)}(h``n``h]hn}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubh that satisfies }(hj6hhhNhNubj)}(h'``4*(((blocksize - 12)/12)^n) >= 2^32``h]h#4*(((blocksize - 12)/12)^n) >= 2^32}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubh is 5.}(hj6hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,,hK]hj6ubah}(h]h ]h"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]uh1jhjV5ubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hj)7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKbhj&7ubah}(h]h ]h"]h$]h&]uh1jhj#7ubj)}(hhh]h)}(h__le32h]h__le32}(hj@7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKchj=7ubah}(h]h ]h"]h$]h&]uh1jhj#7ubj)}(hhh]h)}(h eh_generationh]h eh_generation}(hjW7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKdhjT7ubah}(h]h ]h"]h$]h&]uh1jhj#7ubj)}(hhh]h)}(h@Generation of the tree. (Used by Lustre, but not standard ext4).h]h@Generation of the tree. (Used by Lustre, but not standard ext4).}(hjn7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKehjk7ubah}(h]h ]h"]h$]h&]uh1jhj#7ubeh}(h]h ]h"]h$]h&]uh1jhjV5ubeh}(h]h ]h"]h$]h&]uh1j2hj4ubeh}(h]h ]h"]h$]h&]colsKuh1jhj4ubah}(h]h ]j ah"]h$]h&]uh1jhj3hhhNhNubh)}(hInternal nodes of the extent tree, also known as index nodes, are recorded as ``struct ext4_extent_idx``, and are 12 bytes long:h](hNInternal nodes of the extent tree, also known as index nodes, are recorded as }(hj7hhhNhNubj)}(h``struct ext4_extent_idx``h]hstruct ext4_extent_idx}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubh, and are 12 bytes long:}(hj7hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,,hKghj3hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj7ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj7ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj7ubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhj7ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKnhj7ubah}(h]h ]h"]h$]h&]uh1jhj7ubj)}(hhh]h)}(hSizeh]hSize}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKohj8ubah}(h]h ]h"]h$]h&]uh1jhj7ubj)}(hhh]h)}(hNameh]hName}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKphj8ubah}(h]h ]h"]h$]h&]uh1jhj7ubj)}(hhh]h)}(h Descriptionh]h Description}(hj38hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKqhj08ubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhj7ubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hj\8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKrhjY8ubah}(h]h ]h"]h$]h&]uh1jhjV8ubj)}(hhh]h)}(h__le32h]h__le32}(hjs8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKshjp8ubah}(h]h ]h"]h$]h&]uh1jhjV8ubj)}(hhh]h)}(hei_blockh]hei_block}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKthj8ubah}(h]h ]h"]h$]h&]uh1jhjV8ubj)}(hhh]h)}(h7This index node covers file blocks from 'block' onward.h]h;This index node covers file blocks from ‘block’ onward.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKuhj8ubah}(h]h ]h"]h$]h&]uh1jhjV8ubeh}(h]h ]h"]h$]h&]uh1jhjS8ubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKvhj8ubah}(h]h ]h"]h$]h&]uh1jhj8ubj)}(hhh]h)}(h__le32h]h__le32}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKwhj8ubah}(h]h ]h"]h$]h&]uh1jhj8ubj)}(hhh]h)}(h ei_leaf_loh]h ei_leaf_lo}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKxhj8ubah}(h]h ]h"]h$]h&]uh1jhj8ubj)}(hhh]h)}(hLower 32-bits of the block number of the extent node that is the next level lower in the tree. The tree node pointed to can be either another internal node or a leaf node, described below.h]hLower 32-bits of the block number of the extent node that is the next level lower in the tree. The tree node pointed to can be either another internal node or a leaf node, described below.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKyhj9ubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1jhjS8ubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hj&9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hK|hj#9ubah}(h]h ]h"]h$]h&]uh1jhj 9ubj)}(hhh]h)}(h__le16h]h__le16}(hj=9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hK}hj:9ubah}(h]h ]h"]h$]h&]uh1jhj 9ubj)}(hhh]h)}(h ei_leaf_hih]h ei_leaf_hi}(hjT9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hK~hjQ9ubah}(h]h ]h"]h$]h&]uh1jhj 9ubj)}(hhh]h)}(h$Upper 16-bits of the previous field.h]h$Upper 16-bits of the previous field.}(hjk9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhjh9ubah}(h]h ]h"]h$]h&]uh1jhj 9ubeh}(h]h ]h"]h$]h&]uh1jhjS8ubj)}(hhh](j)}(hhh]h)}(h0xAh]h0xA}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj9ubah}(h]h ]h"]h$]h&]uh1jhj9ubj)}(hhh]h)}(h__u16h]h__u16}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj9ubah}(h]h ]h"]h$]h&]uh1jhj9ubj)}(hhh]h)}(h ei_unusedh]h ei_unused}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj9ubah}(h]h ]h"]h$]h&]uh1jhj9ubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]uh1jhjS8ubeh}(h]h ]h"]h$]h&]uh1j2hj7ubeh}(h]h ]h"]h$]h&]colsKuh1jhj7ubah}(h]h ]j ah"]h$]h&]uh1jhj3hhhNhNubh)}(haLeaf nodes of the extent tree are recorded as ``struct ext4_extent``, and are also 12 bytes long:h](h.Leaf nodes of the extent tree are recorded as }(hj9hhhNhNubj)}(h``struct ext4_extent``h]hstruct ext4_extent}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubh, and are also 12 bytes long:}(hj9hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,,hKhj3hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj:ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj:ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj:ubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhj:ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hjB:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj?:ubah}(h]h ]h"]h$]h&]uh1jhj<:ubj)}(hhh]h)}(hSizeh]hSize}(hjY:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhjV:ubah}(h]h ]h"]h$]h&]uh1jhj<:ubj)}(hhh]h)}(hNameh]hName}(hjp:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhjm:ubah}(h]h ]h"]h$]h&]uh1jhj<:ubj)}(hhh]h)}(h Descriptionh]h Description}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj:ubah}(h]h ]h"]h$]h&]uh1jhj<:ubeh}(h]h ]h"]h$]h&]uh1jhj9:ubah}(h]h ]h"]h$]h&]uh1jhj:ubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj:ubah}(h]h ]h"]h$]h&]uh1jhj:ubj)}(hhh]h)}(h__le32h]h__le32}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj:ubah}(h]h ]h"]h$]h&]uh1jhj:ubj)}(hhh]h)}(hee_blockh]hee_block}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj:ubah}(h]h ]h"]h$]h&]uh1jhj:ubj)}(hhh]h)}(h0First file block number that this extent covers.h]h0First file block number that this extent covers.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj:ubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jhj:ubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj;ubah}(h]h ]h"]h$]h&]uh1jhj;ubj)}(hhh]h)}(h__le16h]h__le16}(hj,;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj);ubah}(h]h ]h"]h$]h&]uh1jhj;ubj)}(hhh]h)}(hee_lenh]hee_len}(hjC;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj@;ubah}(h]h ]h"]h$]h&]uh1jhj;ubj)}(hhh]h)}(hX_Number of blocks covered by extent. If the value of this field is <= 32768, the extent is initialized. If the value of the field is > 32768, the extent is uninitialized and the actual extent length is ``ee_len`` - 32768. Therefore, the maximum length of a initialized extent is 32768 blocks, and the maximum length of an uninitialized extent is 32767.h](hNumber of blocks covered by extent. If the value of this field is <= 32768, the extent is initialized. If the value of the field is > 32768, the extent is uninitialized and the actual extent length is }(hjZ;hhhNhNubj)}(h ``ee_len``h]hee_len}(hjb;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZ;ubh - 32768. Therefore, the maximum length of a initialized extent is 32768 blocks, and the maximum length of an uninitialized extent is 32767.}(hjZ;hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,,hKhjW;ubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhj:ubj)}(hhh](j)}(hhh]h)}(h0x6h]h0x6}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj;ubah}(h]h ]h"]h$]h&]uh1jhj;ubj)}(hhh]h)}(h__le16h]h__le16}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj;ubah}(h]h ]h"]h$]h&]uh1jhj;ubj)}(hhh]h)}(h ee_start_hih]h ee_start_hi}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj;ubah}(h]h ]h"]h$]h&]uh1jhj;ubj)}(hhh]h)}(h>Upper 16-bits of the block number to which this extent points.h]h>Upper 16-bits of the block number to which this extent points.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj;ubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhj:ubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj;ubah}(h]h ]h"]h$]h&]uh1jhj;ubj)}(hhh]h)}(h__le32h]h__le32}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj<ubah}(h]h ]h"]h$]h&]uh1jhj;ubj)}(hhh]h)}(h ee_start_loh]h ee_start_lo}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj<ubah}(h]h ]h"]h$]h&]uh1jhj;ubj)}(hhh]h)}(h>Lower 32-bits of the block number to which this extent points.h]h>Lower 32-bits of the block number to which this extent points.}(hj6<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj3<ubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1j2hj:ubeh}(h]h ]h"]h$]h&]colsKuh1jhj:ubah}(h]h ]j ah"]h$]h&]uh1jhj3hhhNhNubh)}(hXPrior to the introduction of metadata checksums, the extent header + extent entries always left at least 4 bytes of unallocated space at the end of each extent tree data block (because (2^x % 12) >= 4). Therefore, the 32-bit checksum is inserted into this space. The 4 extents in the inode do not need checksumming, since the inode is already checksummed. The checksum is calculated against the FS UUID, the inode number, the inode generation, and the entire extent block leading up to (but not including) the checksum itself.h]hXPrior to the introduction of metadata checksums, the extent header + extent entries always left at least 4 bytes of unallocated space at the end of each extent tree data block (because (2^x % 12) >= 4). Therefore, the 32-bit checksum is inserted into this space. The 4 extents in the inode do not need checksumming, since the inode is already checksummed. The checksum is calculated against the FS UUID, the inode number, the inode generation, and the entire extent block leading up to (but not including) the checksum itself.}(hjc<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj3hhubh)}(h,``struct ext4_extent_tail`` is 4 bytes long:h](j)}(h``struct ext4_extent_tail``h]hstruct ext4_extent_tail}(hju<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq<ubh is 4 bytes long:}(hjq<hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,,hKhj3hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj<ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj<ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj<ubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhj<ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj<ubah}(h]h ]h"]h$]h&]uh1jhj<ubj)}(hhh]h)}(hSizeh]hSize}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj<ubah}(h]h ]h"]h$]h&]uh1jhj<ubj)}(hhh]h)}(hNameh]hName}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj<ubah}(h]h ]h"]h$]h&]uh1jhj<ubj)}(hhh]h)}(h Descriptionh]h Description}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj=ubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jhj<ubj3)}(hhh]j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hj.=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj+=ubah}(h]h ]h"]h$]h&]uh1jhj(=ubj)}(hhh]h)}(h__le32h]h__le32}(hjE=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhjB=ubah}(h]h ]h"]h$]h&]uh1jhj(=ubj)}(hhh]h)}(h eb_checksumh]h eb_checksum}(hj\=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhjY=ubah}(h]h ]h"]h$]h&]uh1jhj(=ubj)}(hhh]h)}(hGChecksum of the extent block, crc32c(uuid+inum+igeneration+extentblock)h]hGChecksum of the extent block, crc32c(uuid+inum+igeneration+extentblock)}(hjs=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhjp=ubah}(h]h ]h"]h$]h&]uh1jhj(=ubeh}(h]h ]h"]h$]h&]uh1jhj%=ubah}(h]h ]h"]h$]h&]uh1j2hj<ubeh}(h]h ]h"]h$]h&]colsKuh1jhj<ubah}(h]h ]j ah"]h$]h&]uh1jhj3hhhNhNubeh}(h] extent-treeah ]h"] extent treeah$]h&]uh1hhj=,hhhj,,hK,ubh)}(hhh](h)}(h Inline Datah]h Inline Data}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hhhj,,hKubh)}(hIf the inline data feature is enabled for the filesystem and the flag is set for the inode, it is possible that the first 60 bytes of the file data are stored here.h]hIf the inline data feature is enabled for the filesystem and the flag is set for the inode, it is possible that the first 60 bytes of the file data are stored here.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,,hKhj=hhubh)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hj=sbah}(h]h ]h"]h$]h&]hhuh1hhj=hhh,Documentation/filesystems/ext4/directory.rsthKubeh}(h] inline-dataah ]h"] inline dataah$]h&]uh1hhj=,hhhj,,hKubeh}(h]the-contents-of-inode-i-blockah ]h"]the contents of inode.i_blockah$]h&]uh1hhhhhhj,,hKubh)}(hhh](h)}(hDirectory Entriesh]hDirectory Entries}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hhhj=hKubh)}(hXIn an ext4 filesystem, a directory is more or less a flat file that maps an arbitrary byte string (usually ASCII) to an inode number on the filesystem. There can be many directory entries across the filesystem that reference the same inode number--these are known as hard links, and that is why hard links cannot reference files on other filesystems. As such, directory entries are found by reading the data block(s) associated with a directory file for the particular directory entry that is desired.h]hXIn an ext4 filesystem, a directory is more or less a flat file that maps an arbitrary byte string (usually ASCII) to an inode number on the filesystem. There can be many directory entries across the filesystem that reference the same inode number--these are known as hard links, and that is why hard links cannot reference files on other filesystems. As such, directory entries are found by reading the data block(s) associated with a directory file for the particular directory entry that is desired.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhj=hhubh)}(hhh](h)}(hLinear (Classic) Directoriesh]hLinear (Classic) Directories}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hhhj=hKubh)}(hX`By default, each directory lists its entries in an “almost-linear” array. I write “almost” because it's not a linear array in the memory sense because directory entries are not split across filesystem blocks. Therefore, it is more accurate to say that a directory is a series of data blocks and that each block contains a linear array of directory entries. The end of each per-block array is signified by reaching the end of the block; the last entry in the block has a record length that takes it all the way to the end of the block. The end of the entire directory is of course signified by reaching the end of the file. Unused directory entries are signified by inode = 0. By default the filesystem uses ``struct ext4_dir_entry_2`` for directory entries unless the “filetype” feature flag is not set, in which case it uses ``struct ext4_dir_entry``.h](hXBy default, each directory lists its entries in an “almost-linear” array. I write “almost” because it’s not a linear array in the memory sense because directory entries are not split across filesystem blocks. Therefore, it is more accurate to say that a directory is a series of data blocks and that each block contains a linear array of directory entries. The end of each per-block array is signified by reaching the end of the block; the last entry in the block has a record length that takes it all the way to the end of the block. The end of the entire directory is of course signified by reaching the end of the file. Unused directory entries are signified by inode = 0. By default the filesystem uses }(hj>hhhNhNubj)}(h``struct ext4_dir_entry_2``h]hstruct ext4_dir_entry_2}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubh` for directory entries unless the “filetype” feature flag is not set, in which case it uses }(hj>hhhNhNubj)}(h``struct ext4_dir_entry``h]hstruct ext4_dir_entry}(hj0>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubh.}(hj>hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj=hKhj>hhubh)}(hThe original directory entry format is ``struct ext4_dir_entry``, which is at most 263 bytes long, though on disk you'll need to reference ``dirent.rec_len`` to know for sure.h](h'The original directory entry format is }(hjH>hhhNhNubj)}(h``struct ext4_dir_entry``h]hstruct ext4_dir_entry}(hjP>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjH>ubhM, which is at most 263 bytes long, though on disk you’ll need to reference }(hjH>hhhNhNubj)}(h``dirent.rec_len``h]hdirent.rec_len}(hjb>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjH>ubh to know for sure.}(hjH>hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj=hK hj>hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj}>ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj}>ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj}>ubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhj}>ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK(hj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubj)}(hhh]h)}(hSizeh]hSize}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK)hj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubj)}(hhh]h)}(hNameh]hName}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK*hj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubj)}(hhh]h)}(h Descriptionh]h Description}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK+hj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jhj}>ubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK,hj?ubah}(h]h ]h"]h$]h&]uh1jhj?ubj)}(hhh]h)}(h__le32h]h__le32}(hj2?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK-hj/?ubah}(h]h ]h"]h$]h&]uh1jhj?ubj)}(hhh]h)}(hinodeh]hinode}(hjI?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK.hjF?ubah}(h]h ]h"]h$]h&]uh1jhj?ubj)}(hhh]h)}(h8Number of the inode that this directory entry points to.h]h8Number of the inode that this directory entry points to.}(hj`?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK/hj]?ubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1jhj?ubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK0hj}?ubah}(h]h ]h"]h$]h&]uh1jhjz?ubj)}(hhh]h)}(h__le16h]h__le16}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK1hj?ubah}(h]h ]h"]h$]h&]uh1jhjz?ubj)}(hhh]h)}(hrec_lenh]hrec_len}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK2hj?ubah}(h]h ]h"]h$]h&]uh1jhjz?ubj)}(hhh]h)}(h8Length of this directory entry. Must be a multiple of 4.h]h8Length of this directory entry. Must be a multiple of 4.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK3hj?ubah}(h]h ]h"]h$]h&]uh1jhjz?ubeh}(h]h ]h"]h$]h&]uh1jhj?ubj)}(hhh](j)}(hhh]h)}(h0x6h]h0x6}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK4hj?ubah}(h]h ]h"]h$]h&]uh1jhj?ubj)}(hhh]h)}(h__le16h]h__le16}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK5hj?ubah}(h]h ]h"]h$]h&]uh1jhj?ubj)}(hhh]h)}(hname_lenh]hname_len}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK6hj@ubah}(h]h ]h"]h$]h&]uh1jhj?ubj)}(hhh]h)}(hLength of the file name.h]hLength of the file name.}(hj*@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK7hj'@ubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1jhj?ubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hjJ@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK8hjG@ubah}(h]h ]h"]h$]h&]uh1jhjD@ubj)}(hhh]h)}(hcharh]hchar}(hja@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK9hj^@ubah}(h]h ]h"]h$]h&]uh1jhjD@ubj)}(hhh]h)}(hname[EXT4_NAME_LEN]h]hname[EXT4_NAME_LEN]}(hjx@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK:hju@ubah}(h]h ]h"]h$]h&]uh1jhjD@ubj)}(hhh]h)}(h File name.h]h File name.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK;hj@ubah}(h]h ]h"]h$]h&]uh1jhjD@ubeh}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1j2hj}>ubeh}(h]h ]h"]h$]h&]colsKuh1jhjz>ubah}(h]h ]j ah"]h$]h&]uh1jhj>hhhNhNubh)}(hXvSince file names cannot be longer than 255 bytes, the new directory entry format shortens the name_len field and uses the space for a file type flag, probably to avoid having to load every inode during directory tree traversal. This format is ``ext4_dir_entry_2``, which is at most 263 bytes long, though on disk you'll need to reference ``dirent.rec_len`` to know for sure.h](hSince file names cannot be longer than 255 bytes, the new directory entry format shortens the name_len field and uses the space for a file type flag, probably to avoid having to load every inode during directory tree traversal. This format is }(hj@hhhNhNubj)}(h``ext4_dir_entry_2``h]hext4_dir_entry_2}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubhM, which is at most 263 bytes long, though on disk you’ll need to reference }(hj@hhhNhNubj)}(h``dirent.rec_len``h]hdirent.rec_len}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubh to know for sure.}(hj@hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj=hK=hj>hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj@ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj@ubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj@ubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhj@ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hj!AhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKHhjAubah}(h]h ]h"]h$]h&]uh1jhjAubj)}(hhh]h)}(hSizeh]hSize}(hj8AhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKIhj5Aubah}(h]h ]h"]h$]h&]uh1jhjAubj)}(hhh]h)}(hNameh]hName}(hjOAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKJhjLAubah}(h]h ]h"]h$]h&]uh1jhjAubj)}(hhh]h)}(h Descriptionh]h Description}(hjfAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKKhjcAubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jhj@ubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKLhjAubah}(h]h ]h"]h$]h&]uh1jhjAubj)}(hhh]h)}(h__le32h]h__le32}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKMhjAubah}(h]h ]h"]h$]h&]uh1jhjAubj)}(hhh]h)}(hinodeh]hinode}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKNhjAubah}(h]h ]h"]h$]h&]uh1jhjAubj)}(hhh]h)}(h8Number of the inode that this directory entry points to.h]h8Number of the inode that this directory entry points to.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKOhjAubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1jhjAubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKPhjAubah}(h]h ]h"]h$]h&]uh1jhjAubj)}(hhh]h)}(h__le16h]h__le16}(hj BhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKQhjBubah}(h]h ]h"]h$]h&]uh1jhjAubj)}(hhh]h)}(hrec_lenh]hrec_len}(hj"BhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKRhjBubah}(h]h ]h"]h$]h&]uh1jhjAubj)}(hhh]h)}(hLength of this directory entry.h]hLength of this directory entry.}(hj9BhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKShj6Bubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1jhjAubj)}(hhh](j)}(hhh]h)}(h0x6h]h0x6}(hjYBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKThjVBubah}(h]h ]h"]h$]h&]uh1jhjSBubj)}(hhh]h)}(h__u8h]h__u8}(hjpBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKUhjmBubah}(h]h ]h"]h$]h&]uh1jhjSBubj)}(hhh]h)}(hname_lenh]hname_len}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKVhjBubah}(h]h ]h"]h$]h&]uh1jhjSBubj)}(hhh]h)}(hLength of the file name.h]hLength of the file name.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKWhjBubah}(h]h ]h"]h$]h&]uh1jhjSBubeh}(h]h ]h"]h$]h&]uh1jhjAubj)}(hhh](j)}(hhh]h)}(h0x7h]h0x7}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKXhjBubah}(h]h ]h"]h$]h&]uh1jhjBubj)}(hhh]h)}(h__u8h]h__u8}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKYhjBubah}(h]h ]h"]h$]h&]uh1jhjBubj)}(hhh]h)}(h file_typeh]h file_type}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKZhjBubah}(h]h ]h"]h$]h&]uh1jhjBubj)}(hhh]h)}(h'File type code, see ftype_ table below.h](hFile type code, see }(hjChhhNhNubj)}(hftype_h]hftype}(hj ChhhNhNubah}(h]h ]h"]h$]h&]nameftypejftypeuh1jhjCjKubh table below.}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj=hK[hjCubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jhjAubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hj8ChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK\hj5Cubah}(h]h ]h"]h$]h&]uh1jhj2Cubj)}(hhh]h)}(hcharh]hchar}(hjOChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK]hjLCubah}(h]h ]h"]h$]h&]uh1jhj2Cubj)}(hhh]h)}(hname[EXT4_NAME_LEN]h]hname[EXT4_NAME_LEN]}(hjfChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK^hjcCubah}(h]h ]h"]h$]h&]uh1jhj2Cubj)}(hhh]h)}(h File name.h]h File name.}(hj}ChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hK_hjzCubah}(h]h ]h"]h$]h&]uh1jhj2Cubeh}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1j2hj@ubeh}(h]h ]h"]h$]h&]colsKuh1jhj@ubah}(h]h ]j ah"]h$]h&]uh1jhj>hhhNhNubj )}(h .. _ftype:h]h}(h]h ]h"]h$]h&]jjCuh1j hMhj>hhhj=j Kubh)}(h7The directory file type is one of the following values:h]h7The directory file type is one of the following values:}(hjChhhNhNubah}(h]jCah ]h"]ftypeah$]h&]uh1hhj=hKchj>hhj }jCjCsj }jCjCsj Kubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjCubj)}(hhh]h}(h]h ]h"]h$]h&]jK@uh1jhjCubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hValueh]hValue}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKihjCubah}(h]h ]h"]h$]h&]uh1jhjCubj)}(hhh]h)}(h Descriptionh]h Description}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKjhjCubah}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jhjCubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hj&DhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKkhj#Dubah}(h]h ]h"]h$]h&]uh1jhj Dubj)}(hhh]h)}(hUnknown.h]hUnknown.}(hj=DhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKlhj:Dubah}(h]h ]h"]h$]h&]uh1jhj Dubeh}(h]h ]h"]h$]h&]uh1jhjDubj)}(hhh](j)}(hhh]h)}(h0x1h]h0x1}(hj]DhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKmhjZDubah}(h]h ]h"]h$]h&]uh1jhjWDubj)}(hhh]h)}(h Regular file.h]h Regular file.}(hjtDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKnhjqDubah}(h]h ]h"]h$]h&]uh1jhjWDubeh}(h]h ]h"]h$]h&]uh1jhjDubj)}(hhh](j)}(hhh]h)}(h0x2h]h0x2}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKohjDubah}(h]h ]h"]h$]h&]uh1jhjDubj)}(hhh]h)}(h Directory.h]h Directory.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKphjDubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1jhjDubj)}(hhh](j)}(hhh]h)}(h0x3h]h0x3}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKqhjDubah}(h]h ]h"]h$]h&]uh1jhjDubj)}(hhh]h)}(hCharacter device file.h]hCharacter device file.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKrhjDubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1jhjDubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKshjDubah}(h]h ]h"]h$]h&]uh1jhjDubj)}(hhh]h)}(hBlock device file.h]hBlock device file.}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKthjEubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1jhjDubj)}(hhh](j)}(hhh]h)}(h0x5h]h0x5}(hj9EhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKuhj6Eubah}(h]h ]h"]h$]h&]uh1jhj3Eubj)}(hhh]h)}(hFIFO.h]hFIFO.}(hjPEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKvhjMEubah}(h]h ]h"]h$]h&]uh1jhj3Eubeh}(h]h ]h"]h$]h&]uh1jhjDubj)}(hhh](j)}(hhh]h)}(h0x6h]h0x6}(hjpEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKwhjmEubah}(h]h ]h"]h$]h&]uh1jhjjEubj)}(hhh]h)}(hSocket.h]hSocket.}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKxhjEubah}(h]h ]h"]h$]h&]uh1jhjjEubeh}(h]h ]h"]h$]h&]uh1jhjDubj)}(hhh](j)}(hhh]h)}(h0x7h]h0x7}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKyhjEubah}(h]h ]h"]h$]h&]uh1jhjEubj)}(hhh]h)}(hSymbolic link.h]hSymbolic link.}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKzhjEubah}(h]h ]h"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1j2hjCubeh}(h]h ]h"]h$]h&]colsKuh1jhjCubah}(h]h ]j ah"]h$]h&]uh1jhj>hhhNhNubh)}(hXTo support directories that are both encrypted and casefolded directories, we must also include hash information in the directory entry. We append ``ext4_extended_dir_entry_2`` to ``ext4_dir_entry_2`` except for the entries for dot and dotdot, which are kept the same. The structure follows immediately after ``name`` and is included in the size listed by ``rec_len`` If a directory entry uses this extension, it may be up to 271 bytes.h](hTo support directories that are both encrypted and casefolded directories, we must also include hash information in the directory entry. We append }(hjEhhhNhNubj)}(h``ext4_extended_dir_entry_2``h]hext4_extended_dir_entry_2}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubh to }(hjEhhhNhNubj)}(h``ext4_dir_entry_2``h]hext4_dir_entry_2}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubhm except for the entries for dot and dotdot, which are kept the same. The structure follows immediately after }(hjEhhhNhNubj)}(h``name``h]hname}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubh' and is included in the size listed by }(hjEhhhNhNubj)}(h ``rec_len``h]hrec_len}(hj)FhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubhE If a directory entry uses this extension, it may be up to 271 bytes.}(hjEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj=hK|hj>hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjDFubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjDFubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjDFubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhjDFubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hjtFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjqFubah}(h]h ]h"]h$]h&]uh1jhjnFubj)}(hhh]h)}(hSizeh]hSize}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjFubah}(h]h ]h"]h$]h&]uh1jhjnFubj)}(hhh]h)}(hNameh]hName}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjFubah}(h]h ]h"]h$]h&]uh1jhjnFubj)}(hhh]h)}(h Descriptionh]h Description}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjFubah}(h]h ]h"]h$]h&]uh1jhjnFubeh}(h]h ]h"]h$]h&]uh1jhjkFubah}(h]h ]h"]h$]h&]uh1jhjDFubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjFubah}(h]h ]h"]h$]h&]uh1jhjFubj)}(hhh]h)}(h__le32h]h__le32}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjFubah}(h]h ]h"]h$]h&]uh1jhjFubj)}(hhh]h)}(hhashh]hhash}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhj Gubah}(h]h ]h"]h$]h&]uh1jhjFubj)}(hhh]h)}(hThe hash of the directory nameh]hThe hash of the directory name}(hj'GhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhj$Gubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1jhjFubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hjGGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjDGubah}(h]h ]h"]h$]h&]uh1jhjAGubj)}(hhh]h)}(h__le32h]h__le32}(hj^GhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhj[Gubah}(h]h ]h"]h$]h&]uh1jhjAGubj)}(hhh]h)}(h minor_hashh]h minor_hash}(hjuGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjrGubah}(h]h ]h"]h$]h&]uh1jhjAGubj)}(hhh]h)}(h$The minor hash of the directory nameh]h$The minor hash of the directory name}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjGubah}(h]h ]h"]h$]h&]uh1jhjAGubeh}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1j2hjDFubeh}(h]h ]h"]h$]h&]colsKuh1jhjAFubah}(h]h ]j ah"]h$]h&]uh1jhj>hhhNhNubh)}(hXIn order to add checksums to these classic directory blocks, a phony ``struct ext4_dir_entry`` is placed at the end of each leaf block to hold the checksum. The directory entry is 12 bytes long. The inode number and name_len fields are set to zero to fool old software into ignoring an apparently empty directory entry, and the checksum is stored in the place where the name normally goes. The structure is ``struct ext4_dir_entry_tail``:h](hEIn order to add checksums to these classic directory blocks, a phony }(hjGhhhNhNubj)}(h``struct ext4_dir_entry``h]hstruct ext4_dir_entry}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubhX9 is placed at the end of each leaf block to hold the checksum. The directory entry is 12 bytes long. The inode number and name_len fields are set to zero to fool old software into ignoring an apparently empty directory entry, and the checksum is stored in the place where the name normally goes. The structure is }(hjGhhhNhNubj)}(h``struct ext4_dir_entry_tail``h]hstruct ext4_dir_entry_tail}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubh:}(hjGhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj=hKhj>hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjGubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjGubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjGubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhjGubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjHubah}(h]h ]h"]h$]h&]uh1jhjHubj)}(hhh]h)}(hSizeh]hSize}(hj5HhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhj2Hubah}(h]h ]h"]h$]h&]uh1jhjHubj)}(hhh]h)}(hNameh]hName}(hjLHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjIHubah}(h]h ]h"]h$]h&]uh1jhjHubj)}(hhh]h)}(h Descriptionh]h Description}(hjcHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhj`Hubah}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jhjGubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjHubah}(h]h ]h"]h$]h&]uh1jhjHubj)}(hhh]h)}(h__le32h]h__le32}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjHubah}(h]h ]h"]h$]h&]uh1jhjHubj)}(hhh]h)}(hdet_reserved_zero1h]hdet_reserved_zero1}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjHubah}(h]h ]h"]h$]h&]uh1jhjHubj)}(hhh]h)}(h!Inode number, which must be zero.h]h!Inode number, which must be zero.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjHubah}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]uh1jhjHubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjHubah}(h]h ]h"]h$]h&]uh1jhjHubj)}(hhh]h)}(h__le16h]h__le16}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjIubah}(h]h ]h"]h$]h&]uh1jhjHubj)}(hhh]h)}(h det_rec_lenh]h det_rec_len}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjIubah}(h]h ]h"]h$]h&]uh1jhjHubj)}(hhh]h)}(h1Length of this directory entry, which must be 12.h]h1Length of this directory entry, which must be 12.}(hj6IhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhj3Iubah}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]uh1jhjHubj)}(hhh](j)}(hhh]h)}(h0x6h]h0x6}(hjVIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjSIubah}(h]h ]h"]h$]h&]uh1jhjPIubj)}(hhh]h)}(h__u8h]h__u8}(hjmIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjjIubah}(h]h ]h"]h$]h&]uh1jhjPIubj)}(hhh]h)}(hdet_reserved_zero2h]hdet_reserved_zero2}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjIubah}(h]h ]h"]h$]h&]uh1jhjPIubj)}(hhh]h)}(h,Length of the file name, which must be zero.h]h,Length of the file name, which must be zero.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjIubah}(h]h ]h"]h$]h&]uh1jhjPIubeh}(h]h ]h"]h$]h&]uh1jhjHubj)}(hhh](j)}(hhh]h)}(h0x7h]h0x7}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjIubah}(h]h ]h"]h$]h&]uh1jhjIubj)}(hhh]h)}(h__u8h]h__u8}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjIubah}(h]h ]h"]h$]h&]uh1jhjIubj)}(hhh]h)}(hdet_reserved_fth]hdet_reserved_ft}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjIubah}(h]h ]h"]h$]h&]uh1jhjIubj)}(hhh]h)}(hFile type, which must be 0xDE.h]hFile type, which must be 0xDE.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjIubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1jhjHubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hj JhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjJubah}(h]h ]h"]h$]h&]uh1jhjJubj)}(hhh]h)}(h__le32h]h__le32}(hj7JhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhj4Jubah}(h]h ]h"]h$]h&]uh1jhjJubj)}(hhh]h)}(h det_checksumh]h det_checksum}(hjNJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjKJubah}(h]h ]h"]h$]h&]uh1jhjJubj)}(hhh]h)}(hDirectory leaf block checksum.h]hDirectory leaf block checksum.}(hjeJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjbJubah}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]uh1j2hjGubeh}(h]h ]h"]h$]h&]colsKuh1jhjGubah}(h]h ]j ah"]h$]h&]uh1jhj>hhhNhNubh)}(hThe leaf directory block checksum is calculated against the FS UUID, the directory's inode number, the directory's inode generation number, and the entire directory entry block up to (but not including) the fake directory entry.h]hThe leaf directory block checksum is calculated against the FS UUID, the directory’s inode number, the directory’s inode generation number, and the entire directory entry block up to (but not including) the fake directory entry.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhj>hhubeh}(h]linear-classic-directoriesah ]h"]linear (classic) directoriesah$]h&]uh1hhj=hhhj=hKubh)}(hhh](h)}(hHash Tree Directoriesh]hHash Tree Directories}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhhhj=hKubh)}(hXA linear array of directory entries isn't great for performance, so a new feature was added to ext3 to provide a faster (but peculiar) balanced tree keyed off a hash of the directory entry name. If the EXT4_INDEX_FL (0x1000) flag is set in the inode, this directory uses a hashed btree (htree) to organize and find directory entries. For backwards read-only compatibility with ext2, this tree is actually hidden inside the directory file, masquerading as “empty” directory data blocks! It was stated previously that the end of the linear directory entry table was signified with an entry pointing to inode 0; this is (ab)used to fool the old linear-scan algorithm into thinking that the rest of the directory block is empty so that it moves on.h]hXA linear array of directory entries isn’t great for performance, so a new feature was added to ext3 to provide a faster (but peculiar) balanced tree keyed off a hash of the directory entry name. If the EXT4_INDEX_FL (0x1000) flag is set in the inode, this directory uses a hashed btree (htree) to organize and find directory entries. For backwards read-only compatibility with ext2, this tree is actually hidden inside the directory file, masquerading as “empty” directory data blocks! It was stated previously that the end of the linear directory entry table was signified with an entry pointing to inode 0; this is (ab)used to fool the old linear-scan algorithm into thinking that the rest of the directory block is empty so that it moves on.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjJhhubh)}(hXThe root of the tree always lives in the first data block of the directory. By ext2 custom, the '.' and '..' entries must appear at the beginning of this first block, so they are put here as two ``struct ext4_dir_entry_2`` s and not stored in the tree. The rest of the root node contains metadata about the tree and finally a hash->block map to find nodes that are lower in the htree. If ``dx_root.info.indirect_levels`` is non-zero then the htree has two levels; the data block pointed to by the root node's map is an interior node, which is indexed by a minor hash. Interior nodes in this tree contains a zeroed out ``struct ext4_dir_entry_2`` followed by a minor_hash->block map to find leafe nodes. Leaf nodes contain a linear array of all ``struct ext4_dir_entry_2``; all of these entries (presumably) hash to the same value. If there is an overflow, the entries simply overflow into the next leaf node, and the least-significant bit of the hash (in the interior node map) that gets us to this next leaf node is set.h](hThe root of the tree always lives in the first data block of the directory. By ext2 custom, the ‘.’ and ‘..’ entries must appear at the beginning of this first block, so they are put here as two }(hjJhhhNhNubj)}(h``struct ext4_dir_entry_2``h]hstruct ext4_dir_entry_2}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh s and not stored in the tree. The rest of the root node contains metadata about the tree and finally a hash->block map to find nodes that are lower in the htree. If }(hjJhhhNhNubj)}(h ``dx_root.info.indirect_levels``h]hdx_root.info.indirect_levels}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh is non-zero then the htree has two levels; the data block pointed to by the root node’s map is an interior node, which is indexed by a minor hash. Interior nodes in this tree contains a zeroed out }(hjJhhhNhNubj)}(h``struct ext4_dir_entry_2``h]hstruct ext4_dir_entry_2}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubhc followed by a minor_hash->block map to find leafe nodes. Leaf nodes contain a linear array of all }(hjJhhhNhNubj)}(h``struct ext4_dir_entry_2``h]hstruct ext4_dir_entry_2}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh; all of these entries (presumably) hash to the same value. If there is an overflow, the entries simply overflow into the next leaf node, and the least-significant bit of the hash (in the interior node map) that gets us to this next leaf node is set.}(hjJhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj=hKhjJhhubh)}(hXTo traverse the directory as a htree, the code calculates the hash of the desired file name and uses it to find the corresponding block number. If the tree is flat, the block is a linear array of directory entries that can be searched; otherwise, the minor hash of the file name is computed and used against this second block to find the corresponding third block number. That third block number will be a linear array of directory entries.h]hXTo traverse the directory as a htree, the code calculates the hash of the desired file name and uses it to find the corresponding block number. If the tree is flat, the block is a linear array of directory entries that can be searched; otherwise, the minor hash of the file name is computed and used against this second block to find the corresponding third block number. That third block number will be a linear array of directory entries.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjJhhubh)}(hX To traverse the directory as a linear array (such as the old code does), the code simply reads every data block in the directory. The blocks used for the htree will appear to have no entries (aside from '.' and '..') and so only the leaf nodes will appear to have any interesting content.h]hX(To traverse the directory as a linear array (such as the old code does), the code simply reads every data block in the directory. The blocks used for the htree will appear to have no entries (aside from ‘.’ and ‘..’) and so only the leaf nodes will appear to have any interesting content.}(hj+KhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjJhhubh)}(hYThe root of the htree is in ``struct dx_root``, which is the full length of a data block:h](hThe root of the htree is in }(hj9KhhhNhNubj)}(h``struct dx_root``h]hstruct dx_root}(hjAKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9Kubh+, which is the full length of a data block:}(hj9KhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj=hKhjJhhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj\Kubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj\Kubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj\Kubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhj\Kubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjKubah}(h]h ]h"]h$]h&]uh1jhjKubj)}(hhh]h)}(hTypeh]hType}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjKubah}(h]h ]h"]h$]h&]uh1jhjKubj)}(hhh]h)}(hNameh]hName}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjKubah}(h]h ]h"]h$]h&]uh1jhjKubj)}(hhh]h)}(h Descriptionh]h Description}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjKubah}(h]h ]h"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhj\Kubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjKubah}(h]h ]h"]h$]h&]uh1jhjKubj)}(hhh]h)}(h__le32h]h__le32}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjLubah}(h]h ]h"]h$]h&]uh1jhjKubj)}(hhh]h)}(h dot.inodeh]h dot.inode}(hj(LhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhj%Lubah}(h]h ]h"]h$]h&]uh1jhjKubj)}(hhh]h)}(hinode number of this directory.h]hinode number of this directory.}(hj?LhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hKhjVubah}(h]h ]h"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jhjUubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hjjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMlhjgVubah}(h]h ]h"]h$]h&]uh1jhjdVubj)}(hhh]h)}(h__le32h]h__le32}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMmhj~Vubah}(h]h ]h"]h$]h&]uh1jhjdVubj)}(hhh]h)}(h fake.inodeh]h fake.inode}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMnhjVubah}(h]h ]h"]h$]h&]uh1jhjdVubj)}(hhh]h)}(h4Zero, to make it look like this entry is not in use.h]h4Zero, to make it look like this entry is not in use.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMohjVubah}(h]h ]h"]h$]h&]uh1jhjdVubeh}(h]h ]h"]h$]h&]uh1jhjaVubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMphjVubah}(h]h ]h"]h$]h&]uh1jhjVubj)}(hhh]h)}(h__le16h]h__le16}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMqhjVubah}(h]h ]h"]h$]h&]uh1jhjVubj)}(hhh]h)}(h fake.rec_lenh]h fake.rec_len}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMrhjVubah}(h]h ]h"]h$]h&]uh1jhjVubj)}(hhh]h)}(h@The size of the block, in order to hide all of the dx_node data.h]h@The size of the block, in order to hide all of the dx_node data.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMshjWubah}(h]h ]h"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]uh1jhjaVubj)}(hhh](j)}(hhh]h)}(h0x6h]h0x6}(hj4WhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMthj1Wubah}(h]h ]h"]h$]h&]uh1jhj.Wubj)}(hhh]h)}(hu8h]hu8}(hjKWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMuhjHWubah}(h]h ]h"]h$]h&]uh1jhj.Wubj)}(hhh]h)}(hname_lenh]hname_len}(hjbWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMvhj_Wubah}(h]h ]h"]h$]h&]uh1jhj.Wubj)}(hhh]h)}(h=Zero. There is no name for this “unused” directory entry.h]h=Zero. There is no name for this “unused” directory entry.}(hjyWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMwhjvWubah}(h]h ]h"]h$]h&]uh1jhj.Wubeh}(h]h ]h"]h$]h&]uh1jhjaVubj)}(hhh](j)}(hhh]h)}(h0x7h]h0x7}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMxhjWubah}(h]h ]h"]h$]h&]uh1jhjWubj)}(hhh]h)}(hu8h]hu8}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMyhjWubah}(h]h ]h"]h$]h&]uh1jhjWubj)}(hhh]h)}(h file_typeh]h file_type}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMzhjWubah}(h]h ]h"]h$]h&]uh1jhjWubj)}(hhh]h)}(hBZero. There is no file type for this “unused” directory entry.h]hBZero. There is no file type for this “unused” directory entry.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hM{hjWubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1jhjaVubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hM|hjWubah}(h]h ]h"]h$]h&]uh1jhjWubj)}(hhh]h)}(h__le16h]h__le16}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hM}hjXubah}(h]h ]h"]h$]h&]uh1jhjWubj)}(hhh]h)}(hlimith]hlimit}(hj,XhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hM~hj)Xubah}(h]h ]h"]h$]h&]uh1jhjWubj)}(hhh]h)}(hWMaximum number of dx_entries that can follow this header, plus 1 for the header itself.h]hWMaximum number of dx_entries that can follow this header, plus 1 for the header itself.}(hjCXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhj@Xubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1jhjaVubj)}(hhh](j)}(hhh]h)}(h0xAh]h0xA}(hjcXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhj`Xubah}(h]h ]h"]h$]h&]uh1jhj]Xubj)}(hhh]h)}(h__le16h]h__le16}(hjzXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhjwXubah}(h]h ]h"]h$]h&]uh1jhj]Xubj)}(hhh]h)}(hcounth]hcount}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhjXubah}(h]h ]h"]h$]h&]uh1jhj]Xubj)}(hhh]h)}(hRActual number of dx_entries that follow this header, plus 1 for the header itself.h]hRActual number of dx_entries that follow this header, plus 1 for the header itself.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhjXubah}(h]h ]h"]h$]h&]uh1jhj]Xubeh}(h]h ]h"]h$]h&]uh1jhjaVubj)}(hhh](j)}(hhh]h)}(h0xEh]h0xE}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhjXubah}(h]h ]h"]h$]h&]uh1jhjXubj)}(hhh]h)}(h__le32h]h__le32}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhjXubah}(h]h ]h"]h$]h&]uh1jhjXubj)}(hhh]h)}(hblockh]hblock}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhjXubah}(h]h ]h"]h$]h&]uh1jhjXubj)}(hhh]h)}(hThe block number (within the directory file) that goes with the lowest hash value of this block. This value is stored in the parent block.h]hThe block number (within the directory file) that goes with the lowest hash value of this block. This value is stored in the parent block.}(hj YhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhj Yubah}(h]h ]h"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]uh1jhjaVubj)}(hhh](j)}(hhh]h)}(h0x12h]h0x12}(hj-YhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhj*Yubah}(h]h ]h"]h$]h&]uh1jhj'Yubj)}(hhh]h)}(hstruct dx_entryh]hstruct dx_entry}(hjDYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhjAYubah}(h]h ]h"]h$]h&]uh1jhj'Yubj)}(hhh]h)}(h entries[0]h]h entries[0]}(hj[YhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhjXYubah}(h]h ]h"]h$]h&]uh1jhj'Yubj)}(hhh]h)}(hIAs many 8-byte ``struct dx_entry`` as fits in the rest of the data block.h](hAs many 8-byte }(hjrYhhhNhNubj)}(h``struct dx_entry``h]hstruct dx_entry}(hjzYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrYubh' as fits in the rest of the data block.}(hjrYhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj=hMhjoYubah}(h]h ]h"]h$]h&]uh1jhj'Yubeh}(h]h ]h"]h$]h&]uh1jhjaVubeh}(h]h ]h"]h$]h&]uh1j2hjUubeh}(h]h ]h"]h$]h&]colsKuh1jhjUubah}(h]h ]j ah"]h$]h&]uh1jhjJhhhNhNubh)}(hThe hash maps that exist in both ``struct dx_root`` and ``struct dx_node`` are recorded as ``struct dx_entry``, which is 8 bytes long:h](h!The hash maps that exist in both }(hjYhhhNhNubj)}(h``struct dx_root``h]hstruct dx_root}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubh and }(hjYhhhNhNubj)}(h``struct dx_node``h]hstruct dx_node}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubh are recorded as }(hjYhhhNhNubj)}(h``struct dx_entry``h]hstruct dx_entry}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubh, which is 8 bytes long:}(hjYhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj=hMhjJhhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjYubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjYubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjYubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhjYubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hj(ZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhj%Zubah}(h]h ]h"]h$]h&]uh1jhj"Zubj)}(hhh]h)}(hTypeh]hType}(hj?ZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhjhjB`ubah}(h]h ]h"]h$]h&]uh1jhj(`ubj)}(hhh]h)}(h h_refcounth]h h_refcount}(hj\`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hK?hjY`ubah}(h]h ]h"]h$]h&]uh1jhj(`ubj)}(hhh]h)}(hReference count.h]hReference count.}(hjs`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hK@hjp`ubah}(h]h ]h"]h$]h&]uh1jhj(`ubeh}(h]h ]h"]h$]h&]uh1jhj_ubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKAhj`ubah}(h]h ]h"]h$]h&]uh1jhj`ubj)}(hhh]h)}(h__le32h]h__le32}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKBhj`ubah}(h]h ]h"]h$]h&]uh1jhj`ubj)}(hhh]h)}(hh_blocksh]hh_blocks}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKChj`ubah}(h]h ]h"]h$]h&]uh1jhj`ubj)}(hhh]h)}(hNumber of disk blocks used.h]hNumber of disk blocks used.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKDhj`ubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jhj_ubj)}(hhh](j)}(hhh]h)}(h0xCh]h0xC}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKEhj`ubah}(h]h ]h"]h$]h&]uh1jhj`ubj)}(hhh]h)}(h__le32h]h__le32}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKFhj aubah}(h]h ]h"]h$]h&]uh1jhj`ubj)}(hhh]h)}(hh_hashh]hh_hash}(hj&ahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKGhj#aubah}(h]h ]h"]h$]h&]uh1jhj`ubj)}(hhh]h)}(hHash value of all attributes.h]hHash value of all attributes.}(hj=ahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKHhj:aubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jhj_ubj)}(hhh](j)}(hhh]h)}(h0x10h]h0x10}(hj]ahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKIhjZaubah}(h]h ]h"]h$]h&]uh1jhjWaubj)}(hhh]h)}(h__le32h]h__le32}(hjtahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKJhjqaubah}(h]h ]h"]h$]h&]uh1jhjWaubj)}(hhh]h)}(h h_checksumh]h h_checksum}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKKhjaubah}(h]h ]h"]h$]h&]uh1jhjWaubj)}(hhh]h)}(h)Checksum of the extended attribute block.h]h)Checksum of the extended attribute block.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKLhjaubah}(h]h ]h"]h$]h&]uh1jhjWaubeh}(h]h ]h"]h$]h&]uh1jhj_ubj)}(hhh](j)}(hhh]h)}(h0x14h]h0x14}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKMhjaubah}(h]h ]h"]h$]h&]uh1jhjaubj)}(hhh]h)}(h__u32h]h__u32}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKNhjaubah}(h]h ]h"]h$]h&]uh1jhjaubj)}(hhh]h)}(h h_reserved[3]h]h h_reserved[3]}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKOhjaubah}(h]h ]h"]h$]h&]uh1jhjaubj)}(hhh]h)}(hZero.h]hZero.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKPhjbubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1j2hj+_ubeh}(h]h ]h"]h$]h&]colsKuh1jhj(_ubah}(h]h ]j ah"]h$]h&]uh1jhjd]hhhNhNubh)}(hThe checksum is calculated against the FS UUID, the 64-bit block number of the extended attribute block, and the entire block (header + entries).h]hThe checksum is calculated against the FS UUID, the 64-bit block number of the extended attribute block, and the entire block (header + entries).}(hj4bhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKRhjd]hhubh)}(hXFollowing the ``struct ext4_xattr_header`` or ``struct ext4_xattr_ibody_header`` is an array of ``struct ext4_xattr_entry``; each of these entries is at least 16 bytes long. When stored in an external block, the ``struct ext4_xattr_entry`` entries must be stored in sorted order. The sort order is ``e_name_index``, then ``e_name_len``, and finally ``e_name``. Attributes stored inside an inode do not need be stored in sorted order.h](hFollowing the }(hjBbhhhNhNubj)}(h``struct ext4_xattr_header``h]hstruct ext4_xattr_header}(hjJbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBbubh or }(hjBbhhhNhNubj)}(h"``struct ext4_xattr_ibody_header``h]hstruct ext4_xattr_ibody_header}(hj\bhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBbubh is an array of }(hjBbhhhNhNubj)}(h``struct ext4_xattr_entry``h]hstruct ext4_xattr_entry}(hjnbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBbubhY; each of these entries is at least 16 bytes long. When stored in an external block, the }(hjBbhhhNhNubj)}(h``struct ext4_xattr_entry``h]hstruct ext4_xattr_entry}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBbubh; entries must be stored in sorted order. The sort order is }(hjBbhhhNhNubj)}(h``e_name_index``h]h e_name_index}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBbubh, then }(hjBbhhhNhNubj)}(h``e_name_len``h]h e_name_len}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBbubh, and finally }(hjBbhhhNhNubj)}(h ``e_name``h]he_name}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBbubhJ. Attributes stored inside an inode do not need be stored in sorted order.}(hjBbhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjS]hKVhjd]hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjbubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjbubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjbubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhjbubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKbhjbubah}(h]h ]h"]h$]h&]uh1jhjbubj)}(hhh]h)}(hTypeh]hType}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKchjcubah}(h]h ]h"]h$]h&]uh1jhjbubj)}(hhh]h)}(hNameh]hName}(hj/chhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKdhj,cubah}(h]h ]h"]h$]h&]uh1jhjbubj)}(hhh]h)}(h Descriptionh]h Description}(hjFchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKehjCcubah}(h]h ]h"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jhjbubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hjochhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKfhjlcubah}(h]h ]h"]h$]h&]uh1jhjicubj)}(hhh]h)}(h__u8h]h__u8}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKghjcubah}(h]h ]h"]h$]h&]uh1jhjicubj)}(hhh]h)}(h e_name_lenh]h e_name_len}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhhjcubah}(h]h ]h"]h$]h&]uh1jhjicubj)}(hhh]h)}(hLength of name.h]hLength of name.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKihjcubah}(h]h ]h"]h$]h&]uh1jhjicubeh}(h]h ]h"]h$]h&]uh1jhjfcubj)}(hhh](j)}(hhh]h)}(h0x1h]h0x1}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKjhjcubah}(h]h ]h"]h$]h&]uh1jhjcubj)}(hhh]h)}(h__u8h]h__u8}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKkhjcubah}(h]h ]h"]h$]h&]uh1jhjcubj)}(hhh]h)}(h e_name_indexh]h e_name_index}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKlhjcubah}(h]h ]h"]h$]h&]uh1jhjcubj)}(hhh]h)}(h:Attribute name index. There is a discussion of this below.h]h:Attribute name index. There is a discussion of this below.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKmhjdubah}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]uh1jhjfcubj)}(hhh](j)}(hhh]h)}(h0x2h]h0x2}(hj9dhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKnhj6dubah}(h]h ]h"]h$]h&]uh1jhj3dubj)}(hhh]h)}(h__le16h]h__le16}(hjPdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKohjMdubah}(h]h ]h"]h$]h&]uh1jhj3dubj)}(hhh]h)}(h e_value_offsh]h e_value_offs}(hjgdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKphjddubah}(h]h ]h"]h$]h&]uh1jhj3dubj)}(hhh]h)}(hXLocation of this attribute's value on the disk block where it is stored. Multiple attributes can share the same value. For an inode attribute this value is relative to the start of the first entry; for a block this value is relative to the start of the block (i.e. the header).h]hXLocation of this attribute’s value on the disk block where it is stored. Multiple attributes can share the same value. For an inode attribute this value is relative to the start of the first entry; for a block this value is relative to the start of the block (i.e. the header).}(hj~dhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKqhj{dubah}(h]h ]h"]h$]h&]uh1jhj3dubeh}(h]h ]h"]h$]h&]uh1jhjfcubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKuhjdubah}(h]h ]h"]h$]h&]uh1jhjdubj)}(hhh]h)}(h__le32h]h__le32}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKvhjdubah}(h]h ]h"]h$]h&]uh1jhjdubj)}(hhh]h)}(h e_value_inumh]h e_value_inum}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKwhjdubah}(h]h ]h"]h$]h&]uh1jhjdubj)}(hhh]h)}(hThe inode where the value is stored. Zero indicates the value is in the same block as this entry. This field is only used if the INCOMPAT_EA_INODE feature is enabled.h]hThe inode where the value is stored. Zero indicates the value is in the same block as this entry. This field is only used if the INCOMPAT_EA_INODE feature is enabled.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKxhjdubah}(h]h ]h"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]uh1jhjfcubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hK{hjeubah}(h]h ]h"]h$]h&]uh1jhjdubj)}(hhh]h)}(h__le32h]h__le32}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hK|hjeubah}(h]h ]h"]h$]h&]uh1jhjdubj)}(hhh]h)}(h e_value_sizeh]h e_value_size}(hj1ehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hK}hj.eubah}(h]h ]h"]h$]h&]uh1jhjdubj)}(hhh]h)}(hLength of attribute value.h]hLength of attribute value.}(hjHehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hK~hjEeubah}(h]h ]h"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]uh1jhjfcubj)}(hhh](j)}(hhh]h)}(h0xCh]h0xC}(hjhehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjeeubah}(h]h ]h"]h$]h&]uh1jhjbeubj)}(hhh]h)}(h__le32h]h__le32}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhj|eubah}(h]h ]h"]h$]h&]uh1jhjbeubj)}(hhh]h)}(he_hashh]he_hash}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjeubah}(h]h ]h"]h$]h&]uh1jhjbeubj)}(hhh]h)}(hHash value of attribute name and attribute value. The kernel doesn't update the hash for in-inode attributes, so for that case this value must be zero, because e2fsck validates any non-zero hash regardless of where the xattr lives.h]hHash value of attribute name and attribute value. The kernel doesn’t update the hash for in-inode attributes, so for that case this value must be zero, because e2fsck validates any non-zero hash regardless of where the xattr lives.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjeubah}(h]h ]h"]h$]h&]uh1jhjbeubeh}(h]h ]h"]h$]h&]uh1jhjfcubj)}(hhh](j)}(hhh]h)}(h0x10h]h0x10}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjeubah}(h]h ]h"]h$]h&]uh1jhjeubj)}(hhh]h)}(hcharh]hchar}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjeubah}(h]h ]h"]h$]h&]uh1jhjeubj)}(hhh]h)}(he_name[e_name_len]h]he_name[e_name_len]}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjeubah}(h]h ]h"]h$]h&]uh1jhjeubj)}(hhh]h)}(h/Attribute name. Does not include trailing NULL.h]h/Attribute name. Does not include trailing NULL.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjfubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]uh1jhjfcubeh}(h]h ]h"]h$]h&]uh1j2hjbubeh}(h]h ]h"]h$]h&]colsKuh1jhjbubah}(h]h ]j ah"]h$]h&]uh1jhjd]hhhNhNubh)}(hXrAttribute values can follow the end of the entry table. There appears to be a requirement that they be aligned to 4-byte boundaries. The values are stored starting at the end of the block and grow towards the xattr_header/xattr_entry table. When the two collide, the overflow is put into a separate disk block. If the disk block fills up, the filesystem returns -ENOSPC.h]hXrAttribute values can follow the end of the entry table. There appears to be a requirement that they be aligned to 4-byte boundaries. The values are stored starting at the end of the block and grow towards the xattr_header/xattr_entry table. When the two collide, the overflow is put into a separate disk block. If the disk block fills up, the filesystem returns -ENOSPC.}(hj?fhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjd]hhubh)}(hbThe first four fields of the ``ext4_xattr_entry`` are set to zero to mark the end of the key list.h](hThe first four fields of the }(hjMfhhhNhNubj)}(h``ext4_xattr_entry``h]hext4_xattr_entry}(hjUfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMfubh1 are set to zero to mark the end of the key list.}(hjMfhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjS]hKhjd]hhubh)}(hhh](h)}(hAttribute Name Indicesh]hAttribute Name Indices}(hjpfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmfhhhjS]hKubh)}(hXLogically speaking, extended attributes are a series of key=value pairs. The keys are assumed to be NULL-terminated strings. To reduce the amount of on-disk space that the keys consume, the beginning of the key string is matched against the attribute name index. If a match is found, the attribute name index field is set, and matching string is removed from the key name. Here is a map of name index values to key prefixes:h]hXLogically speaking, extended attributes are a series of key=value pairs. The keys are assumed to be NULL-terminated strings. To reduce the amount of on-disk space that the keys consume, the beginning of the key string is matched against the attribute name index. If a match is found, the attribute name index field is set, and matching string is removed from the key name. Here is a map of name index values to key prefixes:}(hj~fhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjmfhhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjfubj)}(hhh]h}(h]h ]h"]h$]h&]jK@uh1jhjfubj)}(hhh]j)}(hhh](j)}(hhh]h)}(h Name Indexh]h Name Index}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjfubah}(h]h ]h"]h$]h&]uh1jhjfubj)}(hhh]h)}(h Key Prefixh]h Key Prefix}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjfubah}(h]h ]h"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jhjfubj3)}(hhh](j)}(hhh](j)}(hhh]h)}(hj(h]h0}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjfubah}(h]h ]h"]h$]h&]uh1jhjfubj)}(hhh]h)}(h (no prefix)h]h (no prefix)}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjgubah}(h]h ]h"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]uh1jhjfubj)}(hhh](j)}(hhh]h)}(hj'h]h1}(hj#ghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhj gubah}(h]h ]h"]h$]h&]uh1jhjgubj)}(hhh]h)}(h “user.”h]h “user.”}(hj9ghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhj6gubah}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]uh1jhjfubj)}(hhh](j)}(hhh]h)}(h2h]h2}(hjYghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjVgubah}(h]h ]h"]h$]h&]uh1jhjSgubj)}(hhh]h)}(h“system.posix_acl_access”h]h“system.posix_acl_access”}(hjpghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjmgubah}(h]h ]h"]h$]h&]uh1jhjSgubeh}(h]h ]h"]h$]h&]uh1jhjfubj)}(hhh](j)}(hhh]h)}(h3h]h3}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjgubah}(h]h ]h"]h$]h&]uh1jhjgubj)}(hhh]h)}(h“system.posix_acl_default”h]h“system.posix_acl_default”}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjgubah}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]uh1jhjfubj)}(hhh](j)}(hhh]h)}(h4h]h4}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjgubah}(h]h ]h"]h$]h&]uh1jhjgubj)}(hhh]h)}(h“trusted.”h]h“trusted.”}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjgubah}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]uh1jhjfubj)}(hhh](j)}(hhh]h)}(h6h]h6}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjgubah}(h]h ]h"]h$]h&]uh1jhjgubj)}(hhh]h)}(h“security.”h]h“security.”}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjhubah}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]uh1jhjfubj)}(hhh](j)}(hhh]h)}(h7h]h7}(hj5hhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhj2hubah}(h]h ]h"]h$]h&]uh1jVhj/hubj)}(hhh]h)}(h!“system.” (inline_data only?)h]h!“system.” (inline_data only?)}(hjLhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjIhubah}(h]h ]h"]h$]h&]uh1jhj/hubeh}(h]h ]h"]h$]h&]uh1jhjfubj)}(hhh](j)}(hhh]h)}(h8h]h8}(hjlhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjihubah}(h]h ]h"]h$]h&]uh1jhjfhubj)}(hhh]h)}(h)“system.richacl” (SuSE kernels only?)h]h)“system.richacl” (SuSE kernels only?)}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjhubah}(h]h ]h"]h$]h&]uh1jhjfhubeh}(h]h ]h"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]uh1j2hjfubeh}(h]h ]h"]h$]h&]colsKuh1jhjfubah}(h]h ]j ah"]h$]h&]uh1jhjmfhhhNhNubh)}(hFor example, if the attribute key is “user.fubar”, the attribute name index is set to 1 and the “fubar” name is recorded on disk.h]hFor example, if the attribute key is “user.fubar”, the attribute name index is set to 1 and the “fubar” name is recorded on disk.}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS]hKhjmfhhubeh}(h]attribute-name-indicesah ]h"]attribute name indicesah$]h&]uh1hhjd]hhhjS]hKubh)}(hhh](h)}(h POSIX ACLsh]h POSIX ACLs}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhjS]hKubh)}(hPOSIX ACLs are stored in a reduced version of the Linux kernel (and libacl's) internal ACL format. The key difference is that the version number is different (1) and the ``e_id`` field is only stored for named user and group ACLs.h](hPOSIX ACLs are stored in a reduced version of the Linux kernel (and libacl’s) internal ACL format. The key difference is that the version number is different (1) and the }(hjhhhhNhNubj)}(h``e_id``h]he_id}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubh4 field is only stored for named user and group ACLs.}(hjhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjS]hKhjhhhubeh}(h] posix-aclsah ]h"] posix aclsah$]h&]uh1hhjd]hhhjS]hKubeh}(h]extended-attributesah ]h"]extended attributesah$]h&]uh1hhhhhhjS]hKubeh}(h]dynamic-structuresah ]h"]dynamic structuresah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksjfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj1ierror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}(i_mode]jai_flags]jai_osd1]jiai_osd2]j aftype]j Cadirhash]jPaurefids}(j]j aj]jajy]j8aj ]jajC]jCajP]jSaunameids}(j ij ij:,j7,j jjjj`jyjj j-&j*&j&j&j2,j/,j=j=j,j,j3j3j=j=j=j=ja]j^]jJjJjCjCjY]jV]jSjPjijijhjhjhjhu nametypes}(j ij:,j jj`jj-&j&j2,j=j,j3j=j=ja]jJjCjY]jSjijhjhuh}(j ihj7,hjj jjjyjBj jj*&j%j&j0&j/,j&j=j=,j,jn,j3j,j=j3j=j=j^]j=jJj>jCjCjV]jJjPjSjijd]jhjmfjhjhu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages](hsystem_message)}(hhh]h)}(heUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.h]hgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjiubah}(h]h ]h"]h$]h&]levelKtypeINFOlineM[sourcehuh1jihjwubji)}(hhh]h)}(heUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.h]hgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjiubah}(h]h ]h"]h$]h&]levelKtypejilineMjsourcehuh1jihjubji)}(hhh]h)}(heUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.h]hgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjiubah}(h]h ]h"]h$]h&]levelKtypejilineMsourcehuh1jihj"ubji)}(hhh]h)}(heUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.h]hgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjiubah}(h]h ]h"]h$]h&]levelKtypejilineMsourcehuh1jihj$ubji)}(hhh]h)}(heUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.h]hgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjubah}(h]h ]h"]h$]h&]levelKtypejilineMsourcehuh1jihj%ubetransform_messages] transformerN include_log]*Documentation/filesystems/ext4/dynamic.rst(NNNNta decorationNhhub.