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]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 }(hhhhhNhNubh)}(h``inode.i_file_acl``h]hinode.i_file_acl}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubhX0. 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.}(hhhhhNhNubeh}(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.}(hjhhhNhNubah}(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 }(hj-hhhNhNubh)}(h``ext4_xattr_ibody_header``h]hext4_xattr_ibody_header}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-ubh that is 4 bytes long:}(hj-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubhtable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jWhjTubjX)}(hhh]h}(h]h ]h"]h$]h&]jbKuh1jWhjTubjX)}(hhh]h}(h]h ]h"]h$]h&]jbKuh1jWhjTubjX)}(hhh]h}(h]h ]h"]h$]h&]jbK(uh1jWhjTubhthead)}(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&]uh1j~hjTubhtbody)}(hhh]j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(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)}(hh_magich]hh_magic}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK*hj(ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(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(?)}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK+hj?ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]colsKuh1jRhjOubah}(h]h ]colwidths-givenah"]h$]h&]uh1jMhhhhhNhNubh)}(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 }(hjphhhNhNubh)}(h``struct ext4_xattr_header``h]hstruct ext4_xattr_header}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjpubh, which is 32 bytes long:}(hjphhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK.hhhhubjN)}(hhh]jS)}(hhh](jX)}(hhh]h}(h]h ]h"]h$]h&]jbKuh1jWhjubjX)}(hhh]h}(h]h ]h"]h$]h&]jbKuh1jWhjubjX)}(hhh]h}(h]h ]h"]h$]h&]jbKuh1jWhjubjX)}(hhh]h}(h]h ]h"]h$]h&]jbK(uh1jWhjubj)}(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&]uh1j~hjubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK9hj.ubah}(h]h ]h"]h$]h&]uh1jhj+ubj)}(hhh]h)}(h__le32h]h__le32}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjEubah}(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)}(h,Magic number for identification, 0xEA020000.h]h,Magic number for identification, 0xEA020000.}(hjvhhhNhNubah}(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&]uh1hhhhKAhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__le32h]h__le32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKBhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hh_blocksh]hh_blocks}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKChj&ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hNumber of disk blocks used.h]hNumber of disk blocks used.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKDhj=ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj(ubj)}(hhh](j)}(hhh]h)}(h0xCh]h0xC}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKEhj]ubah}(h]h ]h"]h$]h&]uh1jhjZubj)}(hhh]h)}(h__le32h]h__le32}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKFhjtubah}(h]h ]h"]h$]h&]uh1jhjZubj)}(hhh]h)}(hh_hashh]hh_hash}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKGhjubah}(h]h ]h"]h$]h&]uh1jhjZubj)}(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&]uh1jhjZubeh}(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.}(hj hhhNhNubah}(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&]uh1jhj$ubj)}(hhh]h)}(h__u32h]h__u32}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKNhj>ubah}(h]h ]h"]h$]h&]uh1jhj$ubj)}(hhh]h)}(h h_reserved[3]h]h h_reserved[3]}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKOhjUubah}(h]h ]h"]h$]h&]uh1jhj$ubj)}(hhh]h)}(hZero.h]hZero.}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKPhjlubah}(h]h ]h"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jRhjubah}(h]h ]jlah"]h$]h&]uh1jMhhhhhNhNubh)}(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}(hjhhhNhNubah}(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&]uh1hhhhKVhhhhubjN)}(hhh]jS)}(hhh](jX)}(hhh]h}(h]h ]h"]h$]h&]jbKuh1jWhj9ubjX)}(hhh]h}(h]h ]h"]h$]h&]jbKuh1jWhj9ubjX)}(hhh]h}(h]h ]h"]h$]h&]jbKuh1jWhj9ubjX)}(hhh]h}(h]h ]h"]h$]h&]jbK(uh1jWhj9ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKbhjfubah}(h]h ]h"]h$]h&]uh1jhjcubj)}(hhh]h)}(hTypeh]hType}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKchj}ubah}(h]h ]h"]h$]h&]uh1jhjcubj)}(hhh]h)}(hNameh]hName}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKdhjubah}(h]h ]h"]h$]h&]uh1jhjcubj)}(hhh]h)}(h Descriptionh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKehjubah}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1j~hj9ubj)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKihjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x1h]h0x1}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKjhj9ubah}(h]h ]h"]h$]h&]uh1jhj6ubj)}(hhh]h)}(h__u8h]h__u8}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKkhjPubah}(h]h ]h"]h$]h&]uh1jhj6ubj)}(hhh]h)}(h e_name_indexh]h e_name_index}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKlhjgubah}(h]h ]h"]h$]h&]uh1jhj6ubj)}(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&]uh1hhhhKmhj~ubah}(h]h ]h"]h$]h&]uh1jhj6ubeh}(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}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKvhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h e_value_inumh]h e_value_inum}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKwhj1ubah}(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.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKxhjHubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK{hjhubah}(h]h ]h"]h$]h&]uh1jhjeubj)}(hhh]h)}(h__le32h]h__le32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK|hjubah}(h]h ]h"]h$]h&]uh1jhjeubj)}(hhh]h)}(h e_value_sizeh]h e_value_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK}hjubah}(h]h ]h"]h$]h&]uh1jhjeubj)}(hhh]h)}(hLength of attribute value.h]hLength of attribute value.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK~hjubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(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}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(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}(hj5 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj2 ubah}(h]h ]h"]h$]h&]uh1jhj/ ubj)}(hhh]h)}(hcharh]hchar}(hjL hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjI ubah}(h]h ]h"]h$]h&]uh1jhj/ ubj)}(hhh]h)}(he_name[e_name_len]h]he_name[e_name_len]}(hjc hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj` ubah}(h]h ]h"]h$]h&]uh1jhj/ ubj)}(hhh]h)}(h/Attribute name. Does not include trailing NULL.h]h/Attribute name. Does not include trailing NULL.}(hjz hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjw ubah}(h]h ]h"]h$]h&]uh1jhj/ ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]colsKuh1jRhj6ubah}(h]h ]jlah"]h$]h&]uh1jMhhhhhNhNubh)}(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 hhubjN)}(hhh]jS)}(hhh](jX)}(hhh]h}(h]h ]h"]h$]h&]jbKuh1jWhj ubjX)}(hhh]h}(h]h ]h"]h$]h&]jbK@uh1jWhj 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&]uh1j~hj ubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h0h]h0}(hjU hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjR ubah}(h]h ]h"]h$]h&]uh1jhjO ubj)}(hhh]h)}(h (no prefix)h]h (no prefix)}(hjl hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhji ubah}(h]h ]h"]h$]h&]uh1jhjO ubeh}(h]h ]h"]h$]h&]uh1jhjL 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&]uh1jhjL 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&]uh1jhjL 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&]uh1jhjL ubj)}(hhh](j)}(hhh]h)}(h4h]h4}(hj1 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj. ubah}(h]h ]h"]h$]h&]uh1jhj+ ubj)}(hhh]h)}(h“trusted.”h]h“trusted.”}(hjH hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjE ubah}(h]h ]h"]h$]h&]uh1jhj+ ubeh}(h]h ]h"]h$]h&]uh1jhjL ubj)}(hhh](j)}(hhh]h)}(h6h]h6}(hjh hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhje ubah}(h]h ]h"]h$]h&]uh1jhjb ubj)}(hhh]h)}(h“security.”h]h“security.”}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj| ubah}(h]h ]h"]h$]h&]uh1jhjb ubeh}(h]h ]h"]h$]h&]uh1jhjL 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&]uh1jhjL 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&]uh1jhjL ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]colsKuh1jRhj ubah}(h]h ]jlah"]h$]h&]uh1jMhj 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}(hj3 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0 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 }(hjA hhhNhNubh)}(h``e_id``h]he_id}(hjI hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjA ubh4 field is only stored for named user and group ACLs.}(hjA hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj0 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_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}refids}nameids}(jn jk j- j* jf jc u nametypes}(jn j- jf uh}(jk hj* j jc j0 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.