6sphinx.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/journalmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/zh_TW/filesystems/ext4/journalmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/it_IT/filesystems/ext4/journalmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/ja_JP/filesystems/ext4/journalmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/ko_KR/filesystems/ext4/journalmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/sp_SP/filesystems/ext4/journalmodnameN 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/journal.rsthKubhsection)}(hhh](htitle)}(hJournal (jbd2)h]hJournal (jbd2)}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hX'Introduced in ext3, the ext4 filesystem employs a journal to protect the filesystem against metadata inconsistencies in the case of a system crash. Up to 10,240,000 file system blocks (see man mke2fs(8) for more details on journal size limits) can be reserved inside the filesystem as a place to land “important” data writes on-disk as quickly as possible. Once the important data transaction is fully written to the disk and flushed from the disk write cache, a record of the data being committed is also written to the journal. At some later point in time, the journal code writes the transactions to their final locations on disk (this could involve a lot of seeking or a lot of small read-write-erases) before erasing the commit record. Should the system crash during the second slow write, the journal can be replayed all the way to the latest commit record, guaranteeing the atomicity of whatever gets written through the journal to the disk. The effect of this is to guarantee that the filesystem does not become stuck midway through a metadata update.h]hX'Introduced in ext3, the ext4 filesystem employs a journal to protect the filesystem against metadata inconsistencies in the case of a system crash. Up to 10,240,000 file system blocks (see man mke2fs(8) for more details on journal size limits) can be reserved inside the filesystem as a place to land “important” data writes on-disk as quickly as possible. Once the important data transaction is fully written to the disk and flushed from the disk write cache, a record of the data being committed is also written to the journal. At some later point in time, the journal code writes the transactions to their final locations on disk (this could involve a lot of seeking or a lot of small read-write-erases) before erasing the commit record. Should the system crash during the second slow write, the journal can be replayed all the way to the latest commit record, guaranteeing the atomicity of whatever gets written through the journal to the disk. The effect of this is to guarantee that the filesystem does not become stuck midway through a metadata update.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hX.For performance reasons, ext4 by default only writes filesystem metadata through the journal. This means that file data blocks are /not/ guaranteed to be in any consistent state after a crash. If this default guarantee level (``data=ordered``) is not satisfactory, there is a mount option to control journal behavior. If ``data=journal``, all data and metadata are written to disk through the journal. This is slower but safest. If ``data=writeback``, dirty data blocks are not flushed to the disk before the metadata are written to disk through the journal.h](hFor performance reasons, ext4 by default only writes filesystem metadata through the journal. This means that file data blocks are /not/ guaranteed to be in any consistent state after a crash. If this default guarantee level (}(hhhhhNhNubhliteral)}(h``data=ordered``h]h data=ordered}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubhO) is not satisfactory, there is a mount option to control journal behavior. If }(hhhhhNhNubh)}(h``data=journal``h]h data=journal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubh_, all data and metadata are written to disk through the journal. This is slower but safest. If }(hhhhhNhNubh)}(h``data=writeback``h]hdata=writeback}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubhl, dirty data blocks are not flushed to the disk before the metadata are written to disk through the journal.}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXIn case of ``data=ordered`` mode, Ext4 also supports fast commits which help reduce commit latency significantly. The default ``data=ordered`` mode works by logging metadata blocks to the journal. In fast commit mode, Ext4 only stores the minimal delta needed to recreate the affected metadata in fast commit space that is shared with JBD2. Once the fast commit area fills in or if fast commit is not possible or if JBD2 commit timer goes off, Ext4 performs a traditional full commit. A full commit invalidates all the fast commits that happened before it and thus it makes the fast commit area empty for further fast commits. This feature needs to be enabled at mkfs time.h](h In case of }(hjhhhNhNubh)}(h``data=ordered``h]h data=ordered}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubhc mode, Ext4 also supports fast commits which help reduce commit latency significantly. The default }(hjhhhNhNubh)}(h``data=ordered``h]h data=ordered}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubhX mode works by logging metadata blocks to the journal. In fast commit mode, Ext4 only stores the minimal delta needed to recreate the affected metadata in fast commit space that is shared with JBD2. Once the fast commit area fills in or if fast commit is not possible or if JBD2 commit timer goes off, Ext4 performs a traditional full commit. A full commit invalidates all the fast commits that happened before it and thus it makes the fast commit area empty for further fast commits. This feature needs to be enabled at mkfs time.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hX&The journal inode is typically inode 8. The first 68 bytes of the journal inode are replicated in the ext4 superblock. The journal itself is normal (but hidden) file within the filesystem. The file usually consumes an entire block group, though mke2fs tries to put it in the middle of the disk.h]hX&The journal inode is typically inode 8. The first 68 bytes of the journal inode are replicated in the ext4 superblock. The journal itself is normal (but hidden) file within the filesystem. The file usually consumes an entire block group, though mke2fs tries to put it in the middle of the disk.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK*hhhhubh)}(hYAll fields in jbd2 are written to disk in big-endian order. This is the opposite of ext4.h]hYAll fields in jbd2 are written to disk in big-endian order. This is the opposite of ext4.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hhhhubh)}(h#NOTE: Both ext4 and ocfs2 use jbd2.h]h#NOTE: Both ext4 and ocfs2 use jbd2.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK3hhhhubh)}(hoThe maximum size of a journal embedded in an ext4 filesystem is 2^32 blocks. jbd2 itself does not seem to care.h]hoThe maximum size of a journal embedded in an ext4 filesystem is 2^32 blocks. jbd2 itself does not seem to care.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK5hhhhubh)}(hhh](h)}(hLayouth]hLayout}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK9ubh)}(h0Generally speaking, the journal has this format:h]h0Generally speaking, the journal has this format:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK;hjhhubhtable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jK0uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjubhthead)}(hhh]hrow)}(hhh](hentry)}(hhh]h)}(h Superblockh]h Superblock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKAhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h[descriptor_block (data_blocks or revocation_block) [more data or revocations] commmit_blockh]h[descriptor_block (data_blocks or revocation_block) [more data or revocations] commmit_block}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKBhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h[more transactions...]h]h[more transactions...]}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKDhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhjubhtbody)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj2ubj)}(hhh]h)}(hOne transactionh]hOne transaction}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKFhj>ubah}(h]h ]h"]h$]h&]uh1jhj2ubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1j-hjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]colwidths-givenah"]h$]h&]uh1jhjhhhNhNubh)}(hXNotice that a transaction begins with either a descriptor and some data, or a block revocation list. A finished transaction always ends with a commit. If there is no commit record (or the checksums don't match), the transaction will be discarded during replay.h]hXNotice that a transaction begins with either a descriptor and some data, or a block revocation list. A finished transaction always ends with a commit. If there is no commit record (or the checksums don’t match), the transaction will be discarded during replay.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKIhjhhubeh}(h]layoutah ]h"]layoutah$]h&]uh1hhhhhhhhK9ubh)}(hhh](h)}(hExternal Journalh]hExternal Journal}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKOubh)}(hXOptionally, an ext4 filesystem can be created with an external journal device (as opposed to an internal journal, which uses a reserved inode). In this case, on the filesystem device, ``s_journal_inum`` should be zero and ``s_journal_uuid`` should be set. On the journal device there will be an ext4 super block in the usual place, with a matching UUID. The journal superblock will be in the next full block after the superblock.h](hOptionally, an ext4 filesystem can be created with an external journal device (as opposed to an internal journal, which uses a reserved inode). In this case, on the filesystem device, }(hjhhhNhNubh)}(h``s_journal_inum``h]hs_journal_inum}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh should be zero and }(hjhhhNhNubh)}(h``s_journal_uuid``h]hs_journal_uuid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh should be set. On the journal device there will be an ext4 super block in the usual place, with a matching UUID. The journal superblock will be in the next full block after the superblock.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKQhjhhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jK uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jK uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jK uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jK uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]jK uh1jhjubj)}(hhh]j)}(hhh](j)}(hhh]h)}(h1024 bytes of paddingh]h1024 bytes of padding}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK]hj ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hext4 Superblockh]hext4 Superblock}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK^hj!ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hJournal Superblockh]hJournal Superblock}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK_hj8ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h[descriptor_block (data_blocks or revocation_block) [more data or revocations] commmit_blockh]h[descriptor_block (data_blocks or revocation_block) [more data or revocations] commmit_block}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK`hjOubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h[more transactions...]h]h[more transactions...]}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKbhjfubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhjubj.)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hOne transactionh]hOne transaction}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKfhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j-hjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]jtah"]h$]h&]uh1jhjhhhNhNubeh}(h]external-journalah ]h"]external journalah$]h&]uh1hhhhhhhhKOubh)}(hhh](h)}(h Block Headerh]h Block Header}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKjubh)}(h[Every block in the journal starts with a common 12-byte header ``struct journal_header_s``:h](h?Every block in the journal starts with a common 12-byte header }(hjhhhNhNubh)}(h``struct journal_header_s``h]hstruct journal_header_s}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKlhjhhubj)}(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}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKshjLubah}(h]h ]h"]h$]h&]uh1jhjIubj)}(hhh]h)}(hTypeh]hType}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKthjcubah}(h]h ]h"]h$]h&]uh1jhjIubj)}(hhh]h)}(hNameh]hName}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKuhjzubah}(h]h ]h"]h$]h&]uh1jhjIubj)}(hhh]h)}(h Descriptionh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKvhjubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jhjubj.)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKwhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__be32h]h__be32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKxhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hh_magich]hh_magic}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKyhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hjbd2 magic number, 0xC03B3998.h]hjbd2 magic number, 0xC03B3998.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKzhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK{hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__be32h]h__be32}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK|hj6ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h h_blocktypeh]h h_blocktype}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK}hjMubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hMDescription of what this block contains. See the jbd2_blocktype_ table below.h](h1Description of what this block contains. See the }(hjghhhNhNubh reference)}(hjbd2_blocktype_h]hjbd2_blocktype}(hjqhhhNhNubah}(h]h ]h"]h$]h&]namejbd2_blocktyperefidjbd2-blocktypeuh1johjgresolvedKubh table below.}(hjghhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK~hjdubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__be32h]h__be32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h h_sequenceh]h h_sequence}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h-The transaction ID that goes with this block.h]h-The transaction ID that goes with this block.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j-hjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]jtah"]h$]h&]uh1jhjhhhNhNubhtarget)}(h.. _jbd2_blocktype:h]h}(h]h ]h"]h$]h&]jjuh1jhKhjhhhh referencedKubh)}(h)The journal block type can be any one of:h]h)The journal block type can be any one of:}(hjhhhNhNubah}(h]jah ]h"]jbd2_blocktypeah$]h&]uh1hhhhKhjhhexpect_referenced_by_name}j+jsexpect_referenced_by_id}jjsjKubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhj5ubj)}(hhh]h}(h]h ]h"]h$]h&]jK@uh1jhj5ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hValueh]hValue}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjPubah}(h]h ]h"]h$]h&]uh1jhjMubj)}(hhh]h)}(h Descriptionh]h Description}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjgubah}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jhj5ubj.)}(hhh](j)}(hhh](j)}(hhh]h)}(h1h]h1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hsDescriptor. This block precedes a series of data blocks that were written through the journal during a transaction.h]hsDescriptor. This block precedes a series of data blocks that were written through the journal during a transaction.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h2h]h2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hJBlock commit record. This block signifies the completion of a transaction.h]hJBlock commit record. This block signifies the completion of a transaction.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h3h]h3}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hJournal superblock, v1.h]hJournal superblock, v1.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h4h]h4}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj5ubah}(h]h ]h"]h$]h&]uh1jhj2ubj)}(hhh]h)}(hJournal superblock, v2.h]hJournal superblock, v2.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjLubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h5h]h5}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjlubah}(h]h ]h"]h$]h&]uh1jhjiubj)}(hhh]h)}(hBlock revocation records. This speeds up recovery by enabling the journal to skip writing blocks that were subsequently rewritten.h]hBlock revocation records. This speeds up recovery by enabling the journal to skip writing blocks that were subsequently rewritten.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j-hj5ubeh}(h]h ]h"]h$]h&]colsKuh1jhj2ubah}(h]h ]jtah"]h$]h&]uh1jhjhhhNhNubeh}(h] block-headerah ]h"] block headerah$]h&]uh1hhhhhhhhKjubh)}(hhh](h)}(h Super Blockh]h Super Block}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hThe super block for the journal is much simpler as compared to ext4's. The key data kept within are size of the journal, and where to find the start of the log of transactions.h]hThe super block for the journal is much simpler as compared to ext4’s. The key data kept within are size of the journal, and where to find the start of the log of transactions.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h`The journal superblock is recorded as ``struct journal_superblock_s``, which is 1024 bytes long:h](h&The journal superblock is recorded as }(hjhhhNhNubh)}(h``struct journal_superblock_s``h]hstruct journal_superblock_s}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh, which is 1024 bytes long:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(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}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj*ubah}(h]h ]h"]h$]h&]uh1jhj'ubj)}(hhh]h)}(hTypeh]hType}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjAubah}(h]h ]h"]h$]h&]uh1jhj'ubj)}(hhh]h)}(hNameh]hName}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjXubah}(h]h ]h"]h$]h&]uh1jhj'ubj)}(hhh]h)}(h Descriptionh]h Description}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjoubah}(h]h ]h"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhjubj.)}(hhh](j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h*Static information describing the journal.h]h*Static information describing the journal.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hjournal_header_t (12 bytes)h]hjournal_header_t (12 bytes)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hs_headerh]hs_header}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h/Common header identifying this as a superblock.h]h/Common header identifying this as a superblock.}(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)}(h0xCh]h0xC}(hj; hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj8 ubah}(h]h ]h"]h$]h&]uh1jhj5 ubj)}(hhh]h)}(h__be32h]h__be32}(hjR hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjO ubah}(h]h ]h"]h$]h&]uh1jhj5 ubj)}(hhh]h)}(h s_blocksizeh]h s_blocksize}(hji hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjf ubah}(h]h ]h"]h$]h&]uh1jhj5 ubj)}(hhh]h)}(hJournal device block size.h]hJournal device block size.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj} ubah}(h]h ]h"]h$]h&]uh1jhj5 ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x10h]h0x10}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h__be32h]h__be32}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hs_maxlenh]hs_maxlen}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h'Total number of blocks in this journal.h]h'Total number of blocks in this journal.}(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)}(h0x14h]h0x14}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h__be32h]h__be32}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hs_firsth]hs_first}(hj3 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj0 ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hFirst block of log information.h]hFirst block of log information.}(hjJ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjG ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjd ubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjd ubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjd ubj)}(hhh]h)}(hubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x50h]h0x50}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj^ubah}(h]h ]h"]h$]h&]uh1jhj[ubj)}(hhh]h)}(h__u8h]h__u8}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjuubah}(h]h ]h"]h$]h&]uh1jhj[ubj)}(hhh]h)}(hs_checksum_typeh]hs_checksum_type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhj[ubj)}(hhh]h)}(hPChecksum algorithm used for the journal. See jbd2_checksum_type_ for more info.h](h.Checksum algorithm used for the journal. See }(hjhhhNhNubjp)}(hjbd2_checksum_type_h]hjbd2_checksum_type}(hjhhhNhNubah}(h]h ]h"]h$]h&]namejbd2_checksum_typejjbd2-checksum-typeuh1johjjKubh for more info.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x51h]h0x51}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__u8[3]h]h__u8[3]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h s_padding2h]h s_padding2}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x54h]h0x54}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj/ubah}(h]h ]h"]h$]h&]uh1jhj,ubj)}(hhh]h)}(h__be32h]h__be32}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjFubah}(h]h ]h"]h$]h&]uh1jhj,ubj)}(hhh]h)}(hs_num_fc_blocksh]hs_num_fc_blocks}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj]ubah}(h]h ]h"]h$]h&]uh1jhj,ubj)}(hhh]h)}(h,Number of fast commit blocks in the journal.h]h,Number of fast commit blocks in the journal.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjtubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x58h]h0x58}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__be32h]h__be32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hs_headh]hs_head}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hhBlock number of the head (first unused block) of the journal, only up-to-date when the journal is empty.h]hhBlock number of the head (first unused block) of the journal, only up-to-date when the journal is empty.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x5Ch]h0x5C}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__u32h]h__u32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h s_padding[40]h]h s_padding[40]}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj'ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0xFCh]h0xFC}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjPubah}(h]h ]h"]h$]h&]uh1jhjMubj)}(hhh]h)}(h__be32h]h__be32}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjgubah}(h]h ]h"]h$]h&]uh1jhjMubj)}(hhh]h)}(h s_checksumh]h s_checksum}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj~ubah}(h]h ]h"]h$]h&]uh1jhjMubj)}(hhh]h)}(h?Checksum of the entire superblock, with this field set to zero.h]h?Checksum of the entire superblock, with this field set to zero.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x100h]h0x100}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__u8h]h__u8}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hs_users[16*48]h]hs_users[16*48]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hids of all file systems sharing the log. e2fsprogs/Linux don't allow shared external journals, but I imagine Lustre (or ocfs2?), which use the jbd2 code, might.h]hids of all file systems sharing the log. e2fsprogs/Linux don’t allow shared external journals, but I imagine Lustre (or ocfs2?), which use the jbd2 code, might.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j-hjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]jtah"]h$]h&]uh1jhjhhhNhNubj)}(h.. _jbd2_compat:h]h}(h]h ]h"]h$]h&]jjl uh1jhMhjhhhhjKubh)}(hAThe journal compat features are any combination of the following:h]hAThe journal compat features are any combination of the following:}(hj4hhhNhNubah}(h]jl ah ]h"] jbd2_compatah$]h&]uh1hhhhMhjhhj.}j@j*sj0}jl j*sjKubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjHubj)}(hhh]h}(h]h ]h"]h$]h&]jK@uh1jhjHubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hValueh]hValue}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM"hjcubah}(h]h ]h"]h$]h&]uh1jhj`ubj)}(hhh]h)}(h Descriptionh]h Description}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM#hjzubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jhjHubj.)}(hhh]j)}(hhh](j)}(hhh]h)}(h0x1h]h0x1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM$hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hNJournal maintains checksums on the data blocks. (JBD2_FEATURE_COMPAT_CHECKSUM)h]hNJournal maintains checksums on the data blocks. (JBD2_FEATURE_COMPAT_CHECKSUM)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM%hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j-hjHubeh}(h]h ]h"]h$]h&]colsKuh1jhjEubah}(h]h ]jtah"]h$]h&]uh1jhjhhhNhNubj)}(h.. _jbd2_incompat:h]h}(h]h ]h"]h$]h&]jj uh1jhM(hjhhhhjKubh)}(hCThe journal incompat features are any combination of the following:h]hCThe journal incompat features are any combination of the following:}(hjhhhNhNubah}(h]j ah ]h"] jbd2_incompatah$]h&]uh1hhhhM*hjhhj.}jjsj0}j jsjKubj)}(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}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM0hj#ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h Descriptionh]h Description}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM1hj:ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhjubj.)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x1h]h0x1}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM2hjcubah}(h]h ]h"]h$]h&]uh1jhj`ubj)}(hhh]h)}(hDJournal has block revocation records. (JBD2_FEATURE_INCOMPAT_REVOKE)h]hDJournal has block revocation records. (JBD2_FEATURE_INCOMPAT_REVOKE)}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM3hjzubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jhj]ubj)}(hhh](j)}(hhh]h)}(h0x2h]h0x2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM4hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hIJournal can deal with 64-bit block numbers. (JBD2_FEATURE_INCOMPAT_64BIT)h]hIJournal can deal with 64-bit block numbers. (JBD2_FEATURE_INCOMPAT_64BIT)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM5hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj]ubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM7hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hDJournal commits asynchronously. (JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)h]hDJournal commits asynchronously. (JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM8hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj]ubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM9hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hThis journal uses v2 of the checksum on-disk format. Each journal metadata block gets its own checksum, and the block tags in the descriptor table contain checksums for each of the data blocks in the journal. (JBD2_FEATURE_INCOMPAT_CSUM_V2)h]hThis journal uses v2 of the checksum on-disk format. Each journal metadata block gets its own checksum, and the block tags in the descriptor table contain checksums for each of the data blocks in the journal. (JBD2_FEATURE_INCOMPAT_CSUM_V2)}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM:hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj]ubj)}(hhh](j)}(hhh]h)}(h0x10h]h0x10}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM>hj?ubah}(h]h ]h"]h$]h&]uh1jhj<ubj)}(hhh]h)}(hThis journal uses v3 of the checksum on-disk format. This is the same as v2, but the journal block tag size is fixed regardless of the size of block numbers. (JBD2_FEATURE_INCOMPAT_CSUM_V3)h]hThis journal uses v3 of the checksum on-disk format. This is the same as v2, but the journal block tag size is fixed regardless of the size of block numbers. (JBD2_FEATURE_INCOMPAT_CSUM_V3)}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM?hjVubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhj]ubj)}(hhh](j)}(hhh]h)}(h0x20h]h0x20}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMBhjvubah}(h]h ]h"]h$]h&]uh1jhjsubj)}(hhh]h)}(hCJournal has fast commit blocks. (JBD2_FEATURE_INCOMPAT_FAST_COMMIT)h]hCJournal has fast commit blocks. (JBD2_FEATURE_INCOMPAT_FAST_COMMIT)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMChjubah}(h]h ]h"]h$]h&]uh1jhjsubeh}(h]h ]h"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]uh1j-hjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]jtah"]h$]h&]uh1jhjhhhNhNubj)}(h.. _jbd2_checksum_type:h]h}(h]h ]h"]h$]h&]jjuh1jhMEhjhhhhjKubh)}(hcJournal checksum type codes are one of the following. crc32 or crc32c are the most likely choices.h]hcJournal checksum type codes are one of the following. crc32 or crc32c are the most likely choices.}(hjhhhNhNubah}(h]jah ]h"]jbd2_checksum_typeah$]h&]uh1hhhhMGhjhhj.}jjsj0}jjsjKubj)}(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&]uh1hhhhMNhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h Descriptionh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMOhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhjubj.)}(hhh](j)}(hhh](j)}(hhh]h)}(hjh]h1}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMPhj6ubah}(h]h ]h"]h$]h&]uh1jhj3ubj)}(hhh]h)}(hCRC32h]hCRC32}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMQhjLubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jhj0ubj)}(hhh](j)}(hhh]h)}(hjh]h2}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMRhjlubah}(h]h ]h"]h$]h&]uh1jhjiubj)}(hhh]h)}(hMD5h]hMD5}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMShjubah}(h]h ]h"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]uh1jhj0ubj)}(hhh](j)}(hhh]h)}(hjh]h3}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMThjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hSHA1h]hSHA1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMUhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj0ubj)}(hhh](j)}(hhh]h)}(hj:h]h4}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMVhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hCRC32Ch]hCRC32C}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMWhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]uh1j-hjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]jtah"]h$]h&]uh1jhjhhhNhNubeh}(h] super-blockah ]h"] super blockah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hDescriptor Blockh]hDescriptor Block}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hhhhhMZubh)}(hXTThe descriptor block contains an array of journal block tags that describe the final locations of the data blocks that follow in the journal. Descriptor blocks are open-coded instead of being completely described by a data structure, but here is the block structure anyway. Descriptor blocks consume at least 36 bytes, but use a full block:h]hXTThe descriptor block contains an array of journal block tags that describe the final locations of the data blocks that follow in the journal. Descriptor blocks are open-coded instead of being completely described by a data structure, but here is the block structure anyway. Descriptor blocks consume at least 36 bytes, but use a full block:}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM\hj&hhubj)}(hhh]j)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjHubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjHubj)}(hhh]h}(h]h ]h"]h$]h&]jKuh1jhjHubj)}(hhh]h}(h]h ]h"]h$]h&]jK(uh1jhjHubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMfhjuubah}(h]h ]h"]h$]h&]uh1jhjrubj)}(hhh]h)}(hTypeh]hType}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMghjubah}(h]h ]h"]h$]h&]uh1jhjrubj)}(hhh]h)}(hNameh]hName}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhhjubah}(h]h ]h"]h$]h&]uh1jhjrubj)}(hhh]h)}(h Descriptorh]h Descriptor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMihjubah}(h]h ]h"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jhjHubj.)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMjhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hjournal_header_th]hjournal_header_t}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMkhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h (open coded)h]h (open coded)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMlhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hCommon block header.h]hCommon block header.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMmhj(ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0xCh]h0xC}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMnhjHubah}(h]h ]h"]h$]h&]uh1jhjEubj)}(hhh]h)}(hstruct journal_block_tag_sh]hstruct journal_block_tag_s}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMohj_ubah}(h]h ]h"]h$]h&]uh1jhjEubj)}(hhh]h)}(hopen coded array[]h]hopen coded array[]}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMphjvubah}(h]h ]h"]h$]h&]uh1jhjEubj)}(hhh]h)}(hmEnough tags either to fill up the block or to describe all the data blocks that follow this descriptor block.h]hmEnough tags either to fill up the block or to describe all the data blocks that follow this descriptor block.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMqhjubah}(h]h ]h"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j-hjHubeh}(h]h ]h"]h$]h&]colsKuh1jhjEubah}(h]h ]jtah"]h$]h&]uh1jhj&hhhNhNubh)}(huJournal block tags have any of the following formats, depending on which journal feature and block tag flags are set.h]huJournal block tags have any of the following formats, depending on which journal feature and block tag flags are set.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMthj&hhubh)}(hIf JBD2_FEATURE_INCOMPAT_CSUM_V3 is set, the journal block tag is defined as ``struct journal_block_tag3_s``, which looks like the following. The size is 16 or 32 bytes.h](hMIf JBD2_FEATURE_INCOMPAT_CSUM_V3 is set, the journal block tag is defined as }(hjhhhNhNubh)}(h``struct journal_block_tag3_s``h]hstruct journal_block_tag3_s}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh=, which looks like the following. The size is 16 or 32 bytes.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMwhj&hhubj)}(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&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hTypeh]hType}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj2ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hNameh]hName}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjIubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h Descriptorh]h Descriptor}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj`ubah}(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}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__be32h]h__be32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h t_blocknrh]h t_blocknr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hZLower 32-bits of the location of where the corresponding data block should end up on disk.h]hZLower 32-bits of the location of where the corresponding data block should end up on disk.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__be32h]h__be32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(ht_flagsh]ht_flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hOFlags that go with the descriptor. See the table jbd2_tag_flags_ for more info.h](h1Flags that go with the descriptor. See the table }(hj6hhhNhNubjp)}(hjbd2_tag_flags_h]hjbd2_tag_flags}(hj>hhhNhNubah}(h]h ]h"]h$]h&]namejbd2_tag_flagsjjbd2-tag-flagsuh1johj6jKubh for more info.}(hj6hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj3ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhubah}(h]h ]h"]h$]h&]uh1jhjeubj)}(hhh]h)}(h__be32h]h__be32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjeubj)}(hhh]h)}(ht_blocknr_highh]ht_blocknr_high}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjeubj)}(hhh]h)}(hUpper 32-bits of the location of where the corresponding data block should end up on disk. This is zero if JBD2_FEATURE_INCOMPAT_64BIT is not enabled.h]hUpper 32-bits of the location of where the corresponding data block should end up on disk. This is zero if JBD2_FEATURE_INCOMPAT_64BIT is not enabled.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h0xCh]h0xC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__be32h]h__be32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h t_checksumh]h t_checksum}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hFChecksum of the journal UUID, the sequence number, and the data block.h]hFChecksum of the journal UUID, the sequence number, and the data block.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj/ubj)}(hhh]h)}(hThis field appears to be open coded. It always comes at the end of the tag, after t_checksum. This field is not present if the "same UUID" flag is set.h]hThis field appears to be open coded. It always comes at the end of the tag, after t_checksum. This field is not present if the “same UUID” flag is set.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjMubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h 0x8 or 0xCh]h 0x8 or 0xC}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjmubah}(h]h ]h"]h$]h&]uh1jhjjubj)}(hhh]h)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjjubj)}(hhh]h)}(huuid[16]h]huuid[16]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjjubj)}(hhh]h)}(hA UUID to go with this tag. This field appears to be copied from the ``j_uuid`` field in ``struct journal_s``, but only tune2fs touches that field.h](hEA UUID to go with this tag. This field appears to be copied from the }(hjhhhNhNubh)}(h ``j_uuid``h]hj_uuid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh field in }(hjhhhNhNubh)}(h``struct journal_s``h]hstruct journal_s}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh&, but only tune2fs touches that field.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j-hjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]jtah"]h$]h&]uh1jhj&hhhNhNubj)}(h.. _jbd2_tag_flags:h]h}(h]h ]h"]h$]h&]jjNuh1jhMhj&hhhhjKubh)}(h;The journal tag flags are any combination of the following:h]h;The journal tag flags are any combination of the following:}(hjhhhNhNubah}(h]jNah ]h"]jbd2_tag_flagsah$]h&]uh1hhhhMhj&hhj.}jjsj0}jNjsjKubj)}(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}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj?ubah}(h]h ]h"]h$]h&]uh1jhj<ubj)}(hhh]h)}(h Descriptionh]h Description}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjVubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhj$ubj.)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x1h]h0x1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhj|ubj)}(hhh]h)}(hnOn-disk block is escaped. The first four bytes of the data block just happened to match the jbd2 magic number.h]hnOn-disk block is escaped. The first four bytes of the data block just happened to match the jbd2 magic number.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]uh1jhjyubj)}(hhh](j)}(hhh]h)}(h0x2h]h0x2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hNThis block has the same UUID as previous, therefore the UUID field is omitted.h]hNThis block has the same UUID as previous, therefore the UUID field is omitted.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjyubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h:The data block was deleted by the transaction. (Not used?)h]h:The data block was deleted by the transaction. (Not used?)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjyubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj$ubah}(h]h ]h"]h$]h&]uh1jhj!ubj)}(hhh]h)}(h.This is the last tag in this descriptor block.h]h.This is the last tag in this descriptor block.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj;ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]uh1j-hj$ubeh}(h]h ]h"]h$]h&]colsKuh1jhj!ubah}(h]h ]jtah"]h$]h&]uh1jhj&hhhNhNubh)}(hIf JBD2_FEATURE_INCOMPAT_CSUM_V3 is NOT set, the journal block tag is defined as ``struct journal_block_tag_s``, which looks like the following. The size is 8, 12, 24, or 28 bytes:h](hQIf JBD2_FEATURE_INCOMPAT_CSUM_V3 is NOT set, the journal block tag is defined as }(hjkhhhNhNubh)}(h``struct journal_block_tag_s``h]hstruct journal_block_tag_s}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkubhE, which looks like the following. The size is 8, 12, 24, or 28 bytes:}(hjkhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj&hhubj)}(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&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hTypeh]hType}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hNameh]hName}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h Descriptorh]h Descriptor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(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}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj)ubah}(h]h ]h"]h$]h&]uh1jhj&ubj)}(hhh]h)}(h__be32h]h__be32}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj@ubah}(h]h ]h"]h$]h&]uh1jhj&ubj)}(hhh]h)}(h t_blocknrh]h t_blocknr}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjWubah}(h]h ]h"]h$]h&]uh1jhj&ubj)}(hhh]h)}(hZLower 32-bits of the location of where the corresponding data block should end up on disk.h]hZLower 32-bits of the location of where the corresponding data block should end up on disk.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjnubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhj#ubj)}(hhh](j)}(hhh]h)}(h0x4h]h0x4}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__be16h]h__be16}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h t_checksumh]h t_checksum}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hsChecksum of the journal UUID, the sequence number, and the data block. Note that only the lower 16 bits are stored.h]hsChecksum of the journal UUID, the sequence number, and the data block. Note that only the lower 16 bits are stored.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj#ubj)}(hhh](j)}(hhh]h)}(h0x6h]h0x6}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__be16h]h__be16}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(ht_flagsh]ht_flags}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj!ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hOFlags that go with the descriptor. See the table jbd2_tag_flags_ for more info.h](h1Flags that go with the descriptor. See the table }(hj;hhhNhNubjp)}(hjbd2_tag_flags_h]hjbd2_tag_flags}(hjChhhNhNubah}(h]h ]h"]h$]h&]namejbd2_tag_flagsjjNuh1johj;jKubh for more info.}(hj;hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj8ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj#ubj)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjiubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjiubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjiubj)}(hhh]h)}(h^This next field is only present if the super block indicates support for 64-bit block numbers.h]h^This next field is only present if the super block indicates support for 64-bit block numbers.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]uh1jhj#ubj)}(hhh](j)}(hhh]h)}(h0x8h]h0x8}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h__be32h]h__be32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(ht_blocknr_highh]ht_blocknr_high}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hZUpper 32-bits of the location of where the corresponding data block should end up on disk.h]hZUpper 32-bits of the location of where the corresponding data block should end up on disk.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj#ubj)}(hhh](j)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hThis field appears to be open coded. It always comes at the end of the tag, after t_flags or t_blocknr_high. This field is not present if the "same UUID" flag is set.h]hThis field appears to be open coded. It always comes at the end of the tag, after t_flags or t_blocknr_high. This field is not present if the “same UUID” flag is set.}(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)}(h 0x8 or 0xCh]h 0x8 or 0xC}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjGubah}(h]h ]h"]h$]h&]uh1jhjDubj)}(hhh]h)}(hcharh]hchar}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj^ubah}(h]h ]h"]h$]h&]uh1jhjDubj)}(hhh]h)}(huuid[16]h]huuid[16]}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjuubah}(h]h ]h"]h$]h&]uh1jhjDubj)}(hhh]h)}(hA UUID to go with this tag. This field appears to be copied from the ``j_uuid`` field in ``struct journal_s``, but only tune2fs touches that field.h](hEA UUID to go with this tag. This field appears to be copied from the }(hjhhhNhNubh)}(h ``j_uuid``h]hj_uuid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh field in }(hjhhhNhNubh)}(h``struct journal_s``h]hstruct journal_s}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh&, but only tune2fs touches that field.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1j-hjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]jtah"]h$]h&]uh1jhj&hhhNhNubh)}(hIf JBD2_FEATURE_INCOMPAT_CSUM_V2 or JBD2_FEATURE_INCOMPAT_CSUM_V3 are set, the end of the block is a ``struct jbd2_journal_block_tail``, which looks like this:h](heIf JBD2_FEATURE_INCOMPAT_CSUM_V2 or JBD2_FEATURE_INCOMPAT_CSUM_V3 are set, the end of the block is a }(hjhhhNhNubh)}(h"``struct jbd2_journal_block_tail``h]hstruct jbd2_journal_block_tail}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh, which looks like this:}(hjhhhNhNubeh}(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&]jK(uh1jhj ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hOffseth]hOffset}(hj3 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj0 ubah}(h]h ]h"]h$]h&]uh1jhj- ubj)}(hhh]h)}(hTypeh]hType}(hjJ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjG ubah}(h]h ]h"]h$]h&]uh1jhj- ubj)}(hhh]h)}(hNameh]hName}(hja hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj^ ubah}(h]h ]h"]h$]h&]uh1jhj- ubj)}(hhh]h)}(h Descriptorh]h Descriptor}(hjx hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhju 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)}(h0x0h]h0x0}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h__be32h]h__be32}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h t_checksumh]h t_checksum}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hQChecksum of the journal UUID + the descriptor block, with this field set to zero.h]hQChecksum of the journal UUID + the descriptor block, with this field set to zero.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j-hj ubeh}(h]h ]h"]h$]h&]colsKuh1jhj ubah}(h]h ]jtah"]h$]h&]uh1jhj&hhhNhNubeh}(h]descriptor-blockah ]h"]descriptor blockah$]h&]uh1hhhhhhhhMZubh)}(hhh](h)}(h Data Blockh]h Data Block}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hhhhhMubh)}(hXDIn general, the data blocks being written to disk through the journal are written verbatim into the journal file after the descriptor block. However, if the first four bytes of the block match the jbd2 magic number then those four bytes are replaced with zeroes and the “escaped” flag is set in the descriptor block tag.h]hXDIn general, the data blocks being written to disk through the journal are written verbatim into the journal file after the descriptor block. However, if the first four bytes of the block match the jbd2 magic number then those four bytes are replaced with zeroes and the “escaped” flag is set in the descriptor block tag.}(hj,!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj!hhubeh}(h] data-blockah ]h"] data blockah$]h&]uh1hhhhhhhhMubh)}(hhh](h)}(hRevocation Blockh]hRevocation Block}(hjE!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjB!hhhhhMubh)}(hXgA revocation block is used to prevent replay of a block in an earlier transaction. This is used to mark blocks that were journalled at one time but are no longer journalled. Typically this happens if a metadata block is freed and re-allocated as a file data block; in this case, a journal replay after the file block was written to disk will cause corruption.h]hXgA revocation block is used to prevent replay of a block in an earlier transaction. This is used to mark blocks that were journalled at one time but are no longer journalled. Typically this happens if a metadata block is freed and re-allocated as a file data block; in this case, a journal replay after the file block was written to disk will cause corruption.}(hjS!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjB!hhubh)}(hX**NOTE**: This mechanism is NOT used to express “this journal block is superseded by this other journal block”, as the author (djwong) mistakenly thought. Any block being added to a transaction will cause the removal of all existing revocation records for that block.h](hstrong)}(h**NOTE**h]hNOTE}(hjg!hhhNhNubah}(h]h ]h"]h$]h&]uh1je!hja!ubhX: This mechanism is NOT used to express “this journal block is superseded by this other journal block”, as the author (djwong) mistakenly thought. Any block being added to a transaction will cause the removal of all existing revocation records for that block.}(hja!hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjB!hhubh)}(hRevocation blocks are described in ``struct jbd2_journal_revoke_header_s``, are at least 16 bytes in length, but use a full block:h](h#Revocation blocks are described in }(hj!hhhNhNubh)}(h'``struct jbd2_journal_revoke_header_s``h]h#struct jbd2_journal_revoke_header_s}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!ubh8, are at least 16 bytes in length, but use a full block:}(hj!hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjB!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&]uh1hhhhMhj!ubah}(h]h ]h"]h$]h&]uh1jhj!ubj)}(hhh]h)}(hTypeh]hType}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj!ubah}(h]h ]h"]h$]h&]uh1jhj!ubj)}(hhh]h)}(hNameh]hName}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj!ubah}(h]h ]h"]h$]h&]uh1jhj!ubj)}(hhh]h)}(h Descriptionh]h Description}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj"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)}(h0x0h]h0x0}(hj@"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM!hj="ubah}(h]h ]h"]h$]h&]uh1jhj:"ubj)}(hhh]h)}(hjournal_header_th]hjournal_header_t}(hjW"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM"hjT"ubah}(h]h ]h"]h$]h&]uh1jhj:"ubj)}(hhh]h)}(hr_headerh]hr_header}(hjn"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM#hjk"ubah}(h]h ]h"]h$]h&]uh1jhj:"ubj)}(hhh]h)}(hCommon block header.h]hCommon block header.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM$hj"ubah}(h]h ]h"]h$]h&]uh1jhj:"ubeh}(h]h ]h"]h$]h&]uh1jhj7"ubj)}(hhh](j)}(hhh]h)}(h0xCh]h0xC}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM%hj"ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(hhh]h)}(h__be32h]h__be32}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM&hj"ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(hhh]h)}(hr_counth]hr_count}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM'hj"ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(hhh]h)}(h#Number of bytes used in this block.h]h#Number of bytes used in this block.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM(hj"ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jhj7"ubj)}(hhh](j)}(hhh]h)}(h0x10h]h0x10}(hj #hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM)hj#ubah}(h]h ]h"]h$]h&]uh1jhj#ubj)}(hhh]h)}(h__be32 or __be64h]h__be32 or __be64}(hj!#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM*hj#ubah}(h]h ]h"]h$]h&]uh1jhj#ubj)}(hhh]h)}(h blocks[0]h]h blocks[0]}(hj8#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM+hj5#ubah}(h]h ]h"]h$]h&]uh1jhj#ubj)}(hhh]h)}(hBlocks to revoke.h]hBlocks to revoke.}(hjO#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM,hjL#ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jhj7"ubeh}(h]h ]h"]h$]h&]uh1j-hj!ubeh}(h]h ]h"]h$]h&]colsKuh1jhj!ubah}(h]h ]jtah"]h$]h&]uh1jhjB!hhhNhNubh)}(hAfter r_count is a linear array of block numbers that are effectively revoked by this transaction. The size of each block number is 8 bytes if the superblock advertises 64-bit block number support, or 4 bytes otherwise.h]hAfter r_count is a linear array of block numbers that are effectively revoked by this transaction. The size of each block number is 8 bytes if the superblock advertises 64-bit block number support, or 4 bytes otherwise.}(hj|#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM.hjB!hhubh)}(hIf JBD2_FEATURE_INCOMPAT_CSUM_V2 or JBD2_FEATURE_INCOMPAT_CSUM_V3 are set, the end of the revocation block is a ``struct jbd2_journal_revoke_tail``, which has this format:h](hpIf JBD2_FEATURE_INCOMPAT_CSUM_V2 or JBD2_FEATURE_INCOMPAT_CSUM_V3 are set, the end of the revocation block is a }(hj#hhhNhNubh)}(h#``struct jbd2_journal_revoke_tail``h]hstruct jbd2_journal_revoke_tail}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#ubh, which has this format:}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM3hjB!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&]uh1hhhhM;hj#ubah}(h]h ]h"]h$]h&]uh1jhj#ubj)}(hhh]h)}(hTypeh]hType}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM<hj#ubah}(h]h ]h"]h$]h&]uh1jhj#ubj)}(hhh]h)}(hNameh]hName}(hj $hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM=hj$ubah}(h]h ]h"]h$]h&]uh1jhj#ubj)}(hhh]h)}(h Descriptionh]h Description}(hj"$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM>hj$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)}(h0x0h]h0x0}(hjK$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM?hjH$ubah}(h]h ]h"]h$]h&]uh1jhjE$ubj)}(hhh]h)}(h__be32h]h__be32}(hjb$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM@hj_$ubah}(h]h ]h"]h$]h&]uh1jhjE$ubj)}(hhh]h)}(h r_checksumh]h r_checksum}(hjy$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMAhjv$ubah}(h]h ]h"]h$]h&]uh1jhjE$ubj)}(hhh]h)}(h/Checksum of the journal UUID + revocation blockh]h/Checksum of the journal UUID + revocation block}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMBhj$ubah}(h]h ]h"]h$]h&]uh1jhjE$ubeh}(h]h ]h"]h$]h&]uh1jhjB$ubah}(h]h ]h"]h$]h&]uh1j-hj#ubeh}(h]h ]h"]h$]h&]colsKuh1jhj#ubah}(h]h ]jtah"]h$]h&]uh1jhjB!hhhNhNubeh}(h]revocation-blockah ]h"]revocation blockah$]h&]uh1hhhhhhhhMubh)}(hhh](h)}(h Commit Blockh]h Commit Block}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hhhhhMEubh)}(hThe commit block is a sentry that indicates that a transaction has been completely written to the journal. Once this commit block reaches the journal, the data stored with this transaction can be written to their final locations on disk.h]hThe commit block is a sentry that indicates that a transaction has been completely written to the journal. Once this commit block reaches the journal, the data stored with this transaction can be written to their final locations on disk.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMGhj$hhubh)}(hjThe commit block is described by ``struct commit_header``, which is 32 bytes long (but uses a full block):h](h!The commit block is described by }(hj$hhhNhNubh)}(h``struct commit_header``h]hstruct commit_header}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$ubh1, which is 32 bytes long (but uses a full block):}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMLhj$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}(hj7%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMShj4%ubah}(h]h ]h"]h$]h&]uh1jhj1%ubj)}(hhh]h)}(hTypeh]hType}(hjN%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMThjK%ubah}(h]h ]h"]h$]h&]uh1jhj1%ubj)}(hhh]h)}(hNameh]hName}(hje%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMUhjb%ubah}(h]h ]h"]h$]h&]uh1jhj1%ubj)}(hhh]h)}(h Descriptorh]h Descriptor}(hj|%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMVhjy%ubah}(h]h ]h"]h$]h&]uh1jhj1%ubeh}(h]h ]h"]h$]h&]uh1jhj.%ubah}(h]h ]h"]h$]h&]uh1jhj%ubj.)}(hhh](j)}(hhh](j)}(hhh]h)}(h0x0h]h0x0}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMWhj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubj)}(hhh]h)}(hjournal_header_sh]hjournal_header_s}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMXhj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubj)}(hhh]h)}(h (open coded)h]h (open coded)}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMYhj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubj)}(hhh]h)}(hCommon block header.h]hCommon block header.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMZhj%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&]uh1hhhhM[hj&ubah}(h]h ]h"]h$]h&]uh1jhj&ubj)}(hhh]h)}(h unsigned charh]h unsigned char}(hj!&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM\hj&ubah}(h]h ]h"]h$]h&]uh1jhj&ubj)}(hhh]h)}(h h_chksum_typeh]h h_chksum_type}(hj8&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM]hj5&ubah}(h]h ]h"]h$]h&]uh1jhj&ubj)}(hhh]h)}(hThe type of checksum to use to verify the integrity of the data blocks in the transaction. See jbd2_checksum_type_ for more info.h](h_The type of checksum to use to verify the integrity of the data blocks in the transaction. See }(hjO&hhhNhNubjp)}(hjbd2_checksum_type_h]hjbd2_checksum_type}(hjW&hhhNhNubah}(h]h ]h"]h$]h&]namejbd2_checksum_typejjuh1johjO&jKubh for more info.}(hjO&hhhNhNubeh}(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)}(h0xDh]h0xD}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM`hj&ubah}(h]h ]h"]h$]h&]uh1jhj}&ubj)}(hhh]h)}(h unsigned charh]h unsigned char}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMahj&ubah}(h]h ]h"]h$]h&]uh1jhj}&ubj)}(hhh]h)}(h h_chksum_sizeh]h h_chksum_size}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMbhj&ubah}(h]h ]h"]h$]h&]uh1jhj}&ubj)}(hhh]h)}(h8The number of bytes used by the checksum. Most likely 4.h]h8The number of bytes used by the checksum. Most likely 4.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMchj&ubah}(h]h ]h"]h$]h&]uh1jhj}&ubeh}(h]h ]h"]h$]h&]uh1jhj%ubj)}(hhh](j)}(hhh]h)}(h0xEh]h0xE}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMdhj&ubah}(h]h ]h"]h$]h&]uh1jhj&ubj)}(hhh]h)}(h unsigned charh]h unsigned char}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMehj&ubah}(h]h ]h"]h$]h&]uh1jhj&ubj)}(hhh]h)}(h h_padding[2]h]h h_padding[2]}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMfhj'ubah}(h]h ]h"]h$]h&]uh1jhj&ubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhj%ubj)}(hhh](j)}(hhh]h)}(h0x10h]h0x10}(hj?'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhhj<'ubah}(h]h ]h"]h$]h&]uh1jhj9'ubj)}(hhh]h)}(h__be32h]h__be32}(hjV'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMihjS'ubah}(h]h ]h"]h$]h&]uh1jhj9'ubj)}(hhh]h)}(hh_chksum[JBD2_CHECKSUM_BYTES]h]hh_chksum[JBD2_CHECKSUM_BYTES]}(hjm'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMjhjj'ubah}(h]h ]h"]h$]h&]uh1jhj9'ubj)}(hhh]h)}(hX^32 bytes of space to store checksums. If JBD2_FEATURE_INCOMPAT_CSUM_V2 or JBD2_FEATURE_INCOMPAT_CSUM_V3 are set, the first ``__be32`` is the checksum of the journal UUID and the entire commit block, with this field zeroed. If JBD2_FEATURE_COMPAT_CHECKSUM is set, the first ``__be32`` is the crc32 of all the blocks already written to the transaction.h](h{32 bytes of space to store checksums. If JBD2_FEATURE_INCOMPAT_CSUM_V2 or JBD2_FEATURE_INCOMPAT_CSUM_V3 are set, the first }(hj'hhhNhNubh)}(h ``__be32``h]h__be32}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'ubh is the checksum of the journal UUID and the entire commit block, with this field zeroed. If JBD2_FEATURE_COMPAT_CHECKSUM is set, the first }(hj'hhhNhNubh)}(h ``__be32``h]h__be32}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'ubhC is the crc32 of all the blocks already written to the transaction.}(hj'hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMkhj'ubah}(h]h ]h"]h$]h&]uh1jhj9'ubeh}(h]h ]h"]h$]h&]uh1jhj%ubj)}(hhh](j)}(hhh]h)}(h0x30h]h0x30}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMqhj'ubah}(h]h ]h"]h$]h&]uh1jhj'ubj)}(hhh]h)}(h__be64h]h__be64}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMrhj'ubah}(h]h ]h"]h$]h&]uh1jhj'ubj)}(hhh]h)}(h h_commit_sech]h h_commit_sec}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMshj'ubah}(h]h ]h"]h$]h&]uh1jhj'ubj)}(hhh]h)}(hHThe time that the transaction was committed, in seconds since the epoch.h]hHThe time that the transaction was committed, in seconds since the epoch.}(hj (hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMthj (ubah}(h]h ]h"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]uh1jhj%ubj)}(hhh](j)}(hhh]h)}(h0x38h]h0x38}(hj-(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMuhj*(ubah}(h]h ]h"]h$]h&]uh1jhj'(ubj)}(hhh]h)}(h__be32h]h__be32}(hjD(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMvhjA(ubah}(h]h ]h"]h$]h&]uh1jhj'(ubj)}(hhh]h)}(h h_commit_nsech]h h_commit_nsec}(hj[(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMwhjX(ubah}(h]h ]h"]h$]h&]uh1jhj'(ubj)}(hhh]h)}(h-Nanoseconds component of the above timestamp.h]h-Nanoseconds component of the above timestamp.}(hjr(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMxhjo(ubah}(h]h ]h"]h$]h&]uh1jhj'(ubeh}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1j-hj%ubeh}(h]h ]h"]h$]h&]colsKuh1jhj%ubah}(h]h ]jtah"]h$]h&]uh1jhj$hhhNhNubeh}(h] commit-blockah ]h"] commit blockah$]h&]uh1hhhhhhhhMEubh)}(hhh](h)}(h Fast commitsh]h Fast commits}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hhhhhM{ubh)}(hXFast commit area is organized as a log of tag length values. Each TLV has a ``struct ext4_fc_tl`` in the beginning which stores the tag and the length of the entire field. It is followed by variable length tag specific value. Here is the list of supported tags and their meanings:h](hLFast commit area is organized as a log of tag length values. Each TLV has a }(hj(hhhNhNubh)}(h``struct ext4_fc_tl``h]hstruct ext4_fc_tl}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(ubh in the beginning which stores the tag and the length of the entire field. It is followed by variable length tag specific value. Here is the list of supported tags and their meanings:}(hj(hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM}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)}(hTagh]hTag}(hj )hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj)ubah}(h]h ]h"]h$]h&]uh1jhj)ubj)}(hhh]h)}(hMeaningh]hMeaning}(hj")hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj)ubah}(h]h ]h"]h$]h&]uh1jhj)ubj)}(hhh]h)}(h Value structh]h Value struct}(hj9)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj6)ubah}(h]h ]h"]h$]h&]uh1jhj)ubj)}(hhh]h)}(h Descriptionh]h Description}(hjP)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjM)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)}(hEXT4_FC_TAG_HEADh]hEXT4_FC_TAG_HEAD}(hjy)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjv)ubah}(h]h ]h"]h$]h&]uh1jhjs)ubj)}(hhh]h)}(hFast commit area headerh]hFast commit area header}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj)ubah}(h]h ]h"]h$]h&]uh1jhjs)ubj)}(hhh]h)}(h``struct ext4_fc_head``h]h)}(hj)h]hstruct ext4_fc_head}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj)ubah}(h]h ]h"]h$]h&]uh1hhhhMhj)ubah}(h]h ]h"]h$]h&]uh1jhjs)ubj)}(hhh]h)}(hSStores the TID of the transaction after which these fast commits should be applied.h]hSStores the TID of the transaction after which these fast commits should be applied.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj)ubah}(h]h ]h"]h$]h&]uh1jhjs)ubeh}(h]h ]h"]h$]h&]uh1jhjp)ubj)}(hhh](j)}(hhh]h)}(hEXT4_FC_TAG_ADD_RANGEh]hEXT4_FC_TAG_ADD_RANGE}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj)ubah}(h]h ]h"]h$]h&]uh1jhj)ubj)}(hhh]h)}(hAdd extent to inodeh]hAdd extent to inode}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj)ubah}(h]h ]h"]h$]h&]uh1jhj)ubj)}(hhh]h)}(h``struct ext4_fc_add_range``h]h)}(hj*h]hstruct ext4_fc_add_range}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*ubah}(h]h ]h"]h$]h&]uh1hhhhMhj*ubah}(h]h ]h"]h$]h&]uh1jhj)ubj)}(hhh]h)}(hjCeurefids}(j]jajl ]j*aj ]jaj]jajN]jaunameids}(j.j.jjjjjjj+jj#j j@jl jj jjj!j!jjNj?!j