| .. SPDX-License-Identifier: GPL-2.0 |
| |
| Block Group Descriptors |
| ----------------------- |
| |
| Each block group on the filesystem has one of these descriptors |
| associated with it. As noted in the Layout section above, the group |
| descriptors (if present) are the second item in the block group. The |
| standard configuration is for each block group to contain a full copy of |
| the block group descriptor table unless the sparse\_super feature flag |
| is set. |
| |
| Notice how the group descriptor records the location of both bitmaps and |
| the inode table (i.e. they can float). This means that within a block |
| group, the only data structures with fixed locations are the superblock |
| and the group descriptor table. The flex\_bg mechanism uses this |
| property to group several block groups into a flex group and lay out all |
| of the groups' bitmaps and inode tables into one long run in the first |
| group of the flex group. |
| |
| If the meta\_bg feature flag is set, then several block groups are |
| grouped together into a meta group. Note that in the meta\_bg case, |
| however, the first and last two block groups within the larger meta |
| group contain only group descriptors for the groups inside the meta |
| group. |
| |
| flex\_bg and meta\_bg do not appear to be mutually exclusive features. |
| |
| In ext2, ext3, and ext4 (when the 64bit feature is not enabled), the |
| block group descriptor was only 32 bytes long and therefore ends at |
| bg\_checksum. On an ext4 filesystem with the 64bit feature enabled, the |
| block group descriptor expands to at least the 64 bytes described below; |
| the size is stored in the superblock. |
| |
| If gdt\_csum is set and metadata\_csum is not set, the block group |
| checksum is the crc16 of the FS UUID, the group number, and the group |
| descriptor structure. If metadata\_csum is set, then the block group |
| checksum is the lower 16 bits of the checksum of the FS UUID, the group |
| number, and the group descriptor structure. Both block and inode bitmap |
| checksums are calculated against the FS UUID, the group number, and the |
| entire bitmap. |
| |
| The block group descriptor is laid out in ``struct ext4_group_desc``. |
| |
| .. list-table:: |
| :widths: 8 8 24 40 |
| :header-rows: 1 |
| |
| * - Offset |
| - Size |
| - Name |
| - Description |
| * - 0x0 |
| - \_\_le32 |
| - bg\_block\_bitmap\_lo |
| - Lower 32-bits of location of block bitmap. |
| * - 0x4 |
| - \_\_le32 |
| - bg\_inode\_bitmap\_lo |
| - Lower 32-bits of location of inode bitmap. |
| * - 0x8 |
| - \_\_le32 |
| - bg\_inode\_table\_lo |
| - Lower 32-bits of location of inode table. |
| * - 0xC |
| - \_\_le16 |
| - bg\_free\_blocks\_count\_lo |
| - Lower 16-bits of free block count. |
| * - 0xE |
| - \_\_le16 |
| - bg\_free\_inodes\_count\_lo |
| - Lower 16-bits of free inode count. |
| * - 0x10 |
| - \_\_le16 |
| - bg\_used\_dirs\_count\_lo |
| - Lower 16-bits of directory count. |
| * - 0x12 |
| - \_\_le16 |
| - bg\_flags |
| - Block group flags. See the bgflags_ table below. |
| * - 0x14 |
| - \_\_le32 |
| - bg\_exclude\_bitmap\_lo |
| - Lower 32-bits of location of snapshot exclusion bitmap. |
| * - 0x18 |
| - \_\_le16 |
| - bg\_block\_bitmap\_csum\_lo |
| - Lower 16-bits of the block bitmap checksum. |
| * - 0x1A |
| - \_\_le16 |
| - bg\_inode\_bitmap\_csum\_lo |
| - Lower 16-bits of the inode bitmap checksum. |
| * - 0x1C |
| - \_\_le16 |
| - bg\_itable\_unused\_lo |
| - Lower 16-bits of unused inode count. If set, we needn't scan past the |
| ``(sb.s_inodes_per_group - gdt.bg_itable_unused)``\ th entry in the |
| inode table for this group. |
| * - 0x1E |
| - \_\_le16 |
| - bg\_checksum |
| - Group descriptor checksum; crc16(sb\_uuid+group\_num+bg\_desc) if the |
| RO\_COMPAT\_GDT\_CSUM feature is set, or |
| crc32c(sb\_uuid+group\_num+bg\_desc) & 0xFFFF if the |
| RO\_COMPAT\_METADATA\_CSUM feature is set. The bg\_checksum |
| field in bg\_desc is skipped when calculating crc16 checksum, |
| and set to zero if crc32c checksum is used. |
| * - |
| - |
| - |
| - These fields only exist if the 64bit feature is enabled and s_desc_size |
| > 32. |
| * - 0x20 |
| - \_\_le32 |
| - bg\_block\_bitmap\_hi |
| - Upper 32-bits of location of block bitmap. |
| * - 0x24 |
| - \_\_le32 |
| - bg\_inode\_bitmap\_hi |
| - Upper 32-bits of location of inodes bitmap. |
| * - 0x28 |
| - \_\_le32 |
| - bg\_inode\_table\_hi |
| - Upper 32-bits of location of inodes table. |
| * - 0x2C |
| - \_\_le16 |
| - bg\_free\_blocks\_count\_hi |
| - Upper 16-bits of free block count. |
| * - 0x2E |
| - \_\_le16 |
| - bg\_free\_inodes\_count\_hi |
| - Upper 16-bits of free inode count. |
| * - 0x30 |
| - \_\_le16 |
| - bg\_used\_dirs\_count\_hi |
| - Upper 16-bits of directory count. |
| * - 0x32 |
| - \_\_le16 |
| - bg\_itable\_unused\_hi |
| - Upper 16-bits of unused inode count. |
| * - 0x34 |
| - \_\_le32 |
| - bg\_exclude\_bitmap\_hi |
| - Upper 32-bits of location of snapshot exclusion bitmap. |
| * - 0x38 |
| - \_\_le16 |
| - bg\_block\_bitmap\_csum\_hi |
| - Upper 16-bits of the block bitmap checksum. |
| * - 0x3A |
| - \_\_le16 |
| - bg\_inode\_bitmap\_csum\_hi |
| - Upper 16-bits of the inode bitmap checksum. |
| * - 0x3C |
| - \_\_u32 |
| - bg\_reserved |
| - Padding to 64 bytes. |
| |
| .. _bgflags: |
| |
| Block group flags can be any combination of the following: |
| |
| .. list-table:: |
| :widths: 16 64 |
| :header-rows: 1 |
| |
| * - Value |
| - Description |
| * - 0x1 |
| - inode table and bitmap are not initialized (EXT4\_BG\_INODE\_UNINIT). |
| * - 0x2 |
| - block bitmap is not initialized (EXT4\_BG\_BLOCK\_UNINIT). |
| * - 0x4 |
| - inode table is zeroed (EXT4\_BG\_INODE\_ZEROED). |