3103084afc
Signed-off-by: Wang Jianjian <wangjianjian3@huawei.com> Link: https://lore.kernel.org/r/20220520022255.2120576-2-wangjianjian3@huawei.com Signed-off-by: Theodore Ts'o <tytso@mit.edu>
174 lines
5.3 KiB
ReStructuredText
174 lines
5.3 KiB
ReStructuredText
.. 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).
|