Commit | Line | Data |
---|---|---|
c09f3bac DW |
1 | .. SPDX-License-Identifier: GPL-2.0 |
2 | ||
3 | Checksums | |
4 | --------- | |
5 | ||
6 | Starting in early 2012, metadata checksums were added to all major ext4 | |
3103084a | 7 | and jbd2 data structures. The associated feature flag is metadata_csum. |
c09f3bac DW |
8 | The desired checksum algorithm is indicated in the superblock, though as |
9 | of October 2012 the only supported algorithm is crc32c. Some data | |
10 | structures did not have space to fit a full 32-bit checksum, so only the | |
11 | lower 16 bits are stored. Enabling the 64bit feature increases the data | |
12 | structure size so that full 32-bit checksums can be stored for many data | |
13 | structures. However, existing 32-bit filesystems cannot be extended to | |
14 | enable 64bit mode, at least not without the experimental resize2fs | |
15 | patches to do so. | |
16 | ||
17 | Existing filesystems can have checksumming added by running | |
18 | ``tune2fs -O metadata_csum`` against the underlying device. If tune2fs | |
19 | encounters directory blocks that lack sufficient empty space to add a | |
20 | checksum, it will request that you run ``e2fsck -D`` to have the | |
21 | directories rebuilt with checksums. This has the added benefit of | |
22 | removing slack space from the directory files and rebalancing the htree | |
3103084a | 23 | indexes. If you _ignore_ this step, your directories will not be |
c09f3bac DW |
24 | protected by a checksum! |
25 | ||
26 | The following table describes the data elements that go into each type | |
27 | of checksum. The checksum function is whatever the superblock describes | |
28 | (crc32c as of October 2013) unless noted otherwise. | |
29 | ||
30 | .. list-table:: | |
de7abd7b | 31 | :widths: 20 8 50 |
c09f3bac DW |
32 | :header-rows: 1 |
33 | ||
34 | * - Metadata | |
35 | - Length | |
36 | - Ingredients | |
37 | * - Superblock | |
3103084a | 38 | - __le32 |
c09f3bac DW |
39 | - The entire superblock up to the checksum field. The UUID lives inside |
40 | the superblock. | |
41 | * - MMP | |
3103084a | 42 | - __le32 |
c09f3bac DW |
43 | - UUID + the entire MMP block up to the checksum field. |
44 | * - Extended Attributes | |
3103084a | 45 | - __le32 |
c09f3bac DW |
46 | - UUID + the entire extended attribute block. The checksum field is set to |
47 | zero. | |
48 | * - Directory Entries | |
3103084a | 49 | - __le32 |
c09f3bac DW |
50 | - UUID + inode number + inode generation + the directory block up to the |
51 | fake entry enclosing the checksum field. | |
52 | * - HTREE Nodes | |
3103084a | 53 | - __le32 |
c09f3bac DW |
54 | - UUID + inode number + inode generation + all valid extents + HTREE tail. |
55 | The checksum field is set to zero. | |
56 | * - Extents | |
3103084a | 57 | - __le32 |
c09f3bac DW |
58 | - UUID + inode number + inode generation + the entire extent block up to |
59 | the checksum field. | |
60 | * - Bitmaps | |
3103084a | 61 | - __le32 or __le16 |
c09f3bac DW |
62 | - UUID + the entire bitmap. Checksums are stored in the group descriptor, |
63 | and truncated if the group descriptor size is 32 bytes (i.e. ^64bit) | |
64 | * - Inodes | |
3103084a | 65 | - __le32 |
c09f3bac DW |
66 | - UUID + inode number + inode generation + the entire inode. The checksum |
67 | field is set to zero. Each inode has its own checksum. | |
68 | * - Group Descriptors | |
3103084a WJ |
69 | - __le16 |
70 | - If metadata_csum, then UUID + group number + the entire descriptor; | |
71 | else if gdt_csum, then crc16(UUID + group number + the entire | |
c09f3bac DW |
72 | descriptor). In all cases, only the lower 16 bits are stored. |
73 |