| .. 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). |