ˉ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/attributesmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget//translations/zh_TW/filesystems/ext4/attributesmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget//translations/it_IT/filesystems/ext4/attributesmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget//translations/ja_JP/filesystems/ext4/attributesmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget//translations/ko_KR/filesystems/ext4/attributesmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget//translations/pt_BR/filesystems/ext4/attributesmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget//translations/sp_SP/filesystems/ext4/attributesmodnameN 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:spacepreserveuh1hhhhhhI/var/lib/git/docbuild/linux/Documentation/filesystems/ext4/attributes.rsthKubhsection)}(hhh](htitle)}(hExtended Attributesh]hExtended Attributes}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hXExtended attributes (xattrs) are typically stored in a separate data block on the disk and referenced from inodes via ``inode.i_file_acl*``. The first use of extended attributes seems to have been for storing file ACLs and other security data (selinux). With the ``user_xattr`` mount option it is possible for users to store extended attributes so long as all attribute names begin with “user”; this restriction seems to have disappeared as of Linux 3.0.h](hvExtended attributes (xattrs) are typically stored in a separate data block on the disk and referenced from inodes via }(hhhhhNhNubhliteral)}(h``inode.i_file_acl*``h]hinode.i_file_acl*}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubh|. The first use of extended attributes seems to have been for storing file ACLs and other security data (selinux). With the }(hhhhhNhNubh)}(h``user_xattr``h]h user_xattr}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubh mount option it is possible for users to store extended attributes so long as all attribute names begin with “user”; this restriction seems to have disappeared as of Linux 3.0.}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXThere are two places where extended attributes can be found. The first place is between the end of each inode entry and the beginning of the next inode entry. For example, if inode.i_extra_isize = 28 and sb.inode_size = 256, then there are 256 - (128 + 28) = 100 bytes available for in-inode extended attribute storage. The second place where extended attributes can be found is in the block pointed to by ``inode.i_file_acl``. As of Linux 3.11, it is not possible for this block to contain a pointer to a second extended attribute block (or even the remaining blocks of a cluster). In theory it is possible for each attribute's value to be stored in a separate data block, though as of Linux 3.11 the code does not permit this.h](hXThere are two places where extended attributes can be found. The first place is between the end of each inode entry and the beginning of the next inode entry. For example, if inode.i_extra_isize = 28 and sb.inode_size = 256, then there are 256 - (128 + 28) = 100 bytes available for in-inode extended attribute storage. The second place where extended attributes can be found is in the block pointed to by }(hjhhhNhNubh)}(h``inode.i_file_acl``h]hinode.i_file_acl}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubhX0. As of Linux 3.11, it is not possible for this block to contain a pointer to a second extended attribute block (or even the remaining blocks of a cluster). In theory it is possible for each attribute’s value to be stored in a separate data block, though as of Linux 3.11 the code does not permit this.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h^Keys are generally assumed to be ASCIIZ strings, whereas values can be strings or binary data.h]h^Keys are generally assumed to be ASCIIZ strings, whereas values can be strings or binary data.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hqExtended attributes, when stored after the inode, have a header ``ext4_xattr_ibody_header`` that is 4 bytes long:h](h@Extended attributes, when stored after the inode, have a header }(hjAhhhNhNubh)}(h``ext4_xattr_ibody_header``h]hext4_xattr_ibody_header}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAubh that is 4 bytes long:}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubhtable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jkhjhubjl)}(hhh]h}(h]h ]h"]h$]h&]jvKuh1jkhjhubjl)}(hhh]h}(h]h ]h"]h$]h&]jvKuh1jkhjhubjl)}(hhh]h}(h]h ]h"]h$]h&]jvK(uh1jkhjhubhthead)}(hhh]hrow)}(hhh](hentry)}(hhh]h)}(hOffseth]hOffset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK$hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hTypeh]hType}(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&]uh1jhjhubhtbody)}(hhh]j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK(hjubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h__le32h]h__le32}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)hj%ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hh_magich]hh_magic}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK*hj<ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hMagic number for identification, 0xEA020000. This value is set by the Linux driver, though e2fsprogs doesn't seem to check it(?)h]hMagic number for identification, 0xEA020000. This value is set by the Linux driver, though e2fsprogs doesn’t seem to check it(?)}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK+hjSubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]colsKuh1jfhjcubah}(h]h ]colwidths-givenah"]h$]h&]uh1jahhhhhNhNubh)}(hhThe beginning of an extended attribute block is in ``struct ext4_xattr_header``, which is 32 bytes long:h](h3The beginning of an extended attribute block is in }(hjhhhNhNubh)}(h``struct ext4_xattr_header``h]hstruct ext4_xattr_header}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh, which is 32 bytes long:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK.hhhhubjb)}(hhh]jg)}(hhh](jl)}(hhh]h}(h]h ]h"]h$]h&]jvKuh1jkhjubjl)}(hhh]h}(h]h ]h"]h$]h&]jvKuh1jkhjubjl)}(hhh]h}(h]h ]h"]h$]h&]jvKuh1jkhjubjl)}(hhh]h}(h]h ]h"]h$]h&]jvK(uh1jkhjubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK5hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hTypeh]hType}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hNameh]hName}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK7hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h Descriptionh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK8hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK9hjBubah}(h]h ]h"]h$]h&]uh1jhj?ubj)}(hhh]h)}(h__le32h]h__le32}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjYubah}(h]h ]h"]h$]h&]uh1jhj?ubj)}(hhh]h)}(hh_magich]hh_magic}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK;hjpubah}(h]h ]h"]h$]h&]uh1jhj?ubj)}(hhh]h)}(h,Magic number for identification, 0xEA020000.h]h,Magic number for identification, 0xEA020000.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h h_refcounth]h h_refcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK?hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hReference count.h]hReference count.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK@hjubah}(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&]uh1hhhhKAhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h__le32h]h__le32}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKBhj#ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hh_blocksh]hh_blocks}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKChj:ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hNumber of disk blocks used.h]hNumber of disk blocks used.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKDhjQubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj<ubj)}(hhh](j)}(hhh]h)}(h0xCh]h0xC}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKEhjqubah}(h]h ]h"]h$]h&]uh1jhjnubj)}(hhh]h)}(h__le32h]h__le32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKFhjubah}(h]h ]h"]h$]h&]uh1jhjnubj)}(hhh]h)}(hh_hashh]hh_hash}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKGhjubah}(h]h ]h"]h$]h&]uh1jhjnubj)}(hhh]h)}(hHash value of all attributes.h]hHash value of all attributes.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKHhjubah}(h]h ]h"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]uh1jhj<ubj)}(hhh](j)}(hhh]h)}(h0x10h]h0x10}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKIhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__le32h]h__le32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKJhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h h_checksumh]h h_checksum}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h)Checksum of the extended attribute block.h]h)Checksum of the extended attribute block.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKLhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj<ubj)}(hhh](j)}(hhh]h)}(h0x14h]h0x14}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKMhj;ubah}(h]h ]h"]h$]h&]uh1jhj8ubj)}(hhh]h)}(h__u32h]h__u32}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKNhjRubah}(h]h ]h"]h$]h&]uh1jhj8ubj)}(hhh]h)}(h h_reserved[3]h]h h_reserved[3]}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKOhjiubah}(h]h ]h"]h$]h&]uh1jhj8ubj)}(hhh]h)}(hZero.h]hZero.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKPhjubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jfhjubah}(h]h ]jah"]h$]h&]uh1jahhhhhNhNubh)}(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).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKRhhhhubh)}(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 }(hjhhhNhNubh)}(h``struct ext4_xattr_header``h]hstruct ext4_xattr_header}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh or }(hjhhhNhNubh)}(h"``struct ext4_xattr_ibody_header``h]hstruct ext4_xattr_ibody_header}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh is an array of }(hjhhhNhNubh)}(h``struct ext4_xattr_entry``h]hstruct ext4_xattr_entry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubhY; each of these entries is at least 16 bytes long. When stored in an external block, the }(hjhhhNhNubh)}(h``struct ext4_xattr_entry``h]hstruct ext4_xattr_entry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh; entries must be stored in sorted order. The sort order is }(hjhhhNhNubh)}(h``e_name_index``h]h e_name_index}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh, then }(hjhhhNhNubh)}(h``e_name_len``h]h e_name_len}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh, and finally }(hjhhhNhNubh)}(h ``e_name``h]he_name}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubhJ. Attributes stored inside an inode do not need be stored in sorted order.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKVhhhhubjb)}(hhh]jg)}(hhh](jl)}(hhh]h}(h]h ]h"]h$]h&]jvKuh1jkhjMubjl)}(hhh]h}(h]h ]h"]h$]h&]jvKuh1jkhjMubjl)}(hhh]h}(h]h ]h"]h$]h&]jvKuh1jkhjMubjl)}(hhh]h}(h]h ]h"]h$]h&]jvK(uh1jkhjMubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKbhjzubah}(h]h ]h"]h$]h&]uh1jhjwubj)}(hhh]h)}(hTypeh]hType}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKchjubah}(h]h ]h"]h$]h&]uh1jhjwubj)}(hhh]h)}(hNameh]hName}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKdhjubah}(h]h ]h"]h$]h&]uh1jhjwubj)}(hhh]h)}(h Descriptionh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKehjubah}(h]h ]h"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jhjMubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKfhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__u8h]h__u8}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKghjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h e_name_lenh]h e_name_len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hLength of name.h]hLength of name.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKihj-ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x1h]h0x1}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKjhjMubah}(h]h ]h"]h$]h&]uh1jhjJubj)}(hhh]h)}(h__u8h]h__u8}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKkhjdubah}(h]h ]h"]h$]h&]uh1jhjJubj)}(hhh]h)}(h e_name_indexh]h e_name_index}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKlhj{ubah}(h]h ]h"]h$]h&]uh1jhjJubj)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKmhjubah}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x2h]h0x2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKnhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__le16h]h__le16}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKohjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h e_value_offsh]h e_value_offs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKphjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(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).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKqhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKuhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__le32h]h__le32}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKvhj.ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h e_value_inumh]h e_value_inum}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKwhjEubah}(h]h ]h"]h$]h&]uh1jhjubj)}(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.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKxhj\ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK{hj|ubah}(h]h ]h"]h$]h&]uh1jhjyubj)}(hhh]h)}(h__le32h]h__le32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK|hjubah}(h]h ]h"]h$]h&]uh1jhjyubj)}(hhh]h)}(h e_value_sizeh]h e_value_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK}hjubah}(h]h ]h"]h$]h&]uh1jhjyubj)}(hhh]h)}(hLength of attribute value.h]hLength of attribute value.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK~hjubah}(h]h ]h"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0xCh]h0xC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__le32h]h__le32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(he_hashh]he_hash}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(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.}(hj) hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj& ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x10h]h0x10}(hjI hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjF ubah}(h]h ]h"]h$]h&]uh1jhjC ubj)}(hhh]h)}(hcharh]hchar}(hj` hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj] ubah}(h]h ]h"]h$]h&]uh1jhjC ubj)}(hhh]h)}(he_name[e_name_len]h]he_name[e_name_len]}(hjw hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjt ubah}(h]h ]h"]h$]h&]uh1jhjC ubj)}(hhh]h)}(h/Attribute name. Does not include trailing NULL.h]h/Attribute name. Does not include trailing NULL.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhjC ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]colsKuh1jfhjJubah}(h]h ]jah"]h$]h&]uh1jahhhhhNhNubh)}(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 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(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 }(hj hhhNhNubh)}(h``ext4_xattr_entry``h]hext4_xattr_entry}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj ubh1 are set to zero to mark the end of the key list.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hAttribute Name Indicesh]hAttribute Name Indices}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKubh)}(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 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubjb)}(hhh]jg)}(hhh](jl)}(hhh]h}(h]h ]h"]h$]h&]jvKuh1jkhj ubjl)}(hhh]h}(h]h ]h"]h$]h&]jvK@uh1jkhj ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(h Name Indexh]h Name Index}(hj) hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj& ubah}(h]h ]h"]h$]h&]uh1jhj# ubj)}(hhh]h)}(h Key Prefixh]h Key Prefix}(hj@ hhhNhNubah}(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 ubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h0h]h0}(hji hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjf ubah}(h]h ]h"]h$]h&]uh1jhjc ubj)}(hhh]h)}(h (no prefix)h]h (no prefix)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj} ubah}(h]h ]h"]h$]h&]uh1jhjc ubeh}(h]h ]h"]h$]h&]uh1jhj` ubj)}(hhh](j)}(hhh]h)}(h1h]h1}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h “user.”h]h “user.”}(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)}(h2h]h2}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h“system.posix_acl_access”h]h“system.posix_acl_access”}(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)}(h3h]h3}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h“system.posix_acl_default”h]h“system.posix_acl_default”}(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)}(h4h]h4}(hjE hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjB ubah}(h]h ]h"]h$]h&]uh1jhj? ubj)}(hhh]h)}(h“trusted.”h]h“trusted.”}(hj\ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjY ubah}(h]h ]h"]h$]h&]uh1jhj? ubeh}(h]h ]h"]h$]h&]uh1jhj` ubj)}(hhh](j)}(hhh]h)}(h6h]h6}(hj| hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjy ubah}(h]h ]h"]h$]h&]uh1jhjv ubj)}(hhh]h)}(h“security.”h]h“security.”}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhjv ubeh}(h]h ]h"]h$]h&]uh1jhj` ubj)}(hhh](j)}(hhh]h)}(h7h]h7}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h!“system.” (inline_data only?)h]h!“system.” (inline_data only?)}(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)}(h8h]h8}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h)“system.richacl” (SuSE kernels only?)h]h)“system.richacl” (SuSE kernels only?)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj` ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]colsKuh1jfhj ubah}(h]h ]jah"]h$]h&]uh1jahj hhhNhNubh)}(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.}(hj. hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h]attribute-name-indicesah ]h"]attribute name indicesah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h POSIX ACLsh]h POSIX ACLs}(hjG hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjD hhhhhKubh)}(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 }(hjU hhhNhNubh)}(h``e_id``h]he_id}(hj] hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjU ubh4 field is only stored for named user and group ACLs.}(hjU hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjD hhubeh}(h] posix-aclsah ]h"] posix aclsah$]h&]uh1hhhhhhhhKubeh}(h]extended-attributesah ]h"]extended attributesah$]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_handlerj error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj _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}refids}nameids}(j j jA j> jz jw u nametypes}(j jA jz uh}(j hj> j jw jD u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.